Diagnosis Masalah Pemuatan Server Linux dengan Skrip Sederhana
Jika Anda telah menjadi admin untuk waktu yang lama, Anda pasti telah menemukan situasi di mana server lonjakan dalam penggunaan CPU atau pemanfaatan memori dan / atau level beban. Menjalankan 'top' juga tidak selalu memberikan jawaban. Jadi bagaimana Anda menemukan proses-proses licik yang mengunyah sumber daya sistem Anda untuk dapat membunuh mereka?
Skrip berikut mungkin dapat membantu. Itu ditulis untuk server web, sehingga memiliki beberapa bagian yang secara khusus mencari proses httpd dan beberapa bagian yang berhubungan dengan MySQL. Bergantung pada penyebaran server Anda, cukup komentar / hapus bagian-bagian itu dan tambahkan yang lain. Ini harus digunakan untuk titik awal.
Prasyarat untuk versi skrip ini adalah beberapa freeware yang dirilis di bawah Lisensi Publik Umum GNU yang disebut mytop (tersedia di http://jeremy.zawodny.com/mysql/mytop/) yang merupakan alat fantastis untuk memeriksa kinerja MySQL. Sudah mulai tua, tetapi masih berfungsi bagus untuk tujuan kita di sini.
Selain itu, saya menggunakan mutt sebagai mailer - Anda mungkin ingin mengubah script untuk hanya menggunakan utilitas 'mail' yang dibangun di linux. Saya menjalankannya melalui cron setiap jam; sesuaikan sesuai keinginan Anda. Oh - dan skrip ini perlu dijalankan sebagai root karena tidak dibaca dari beberapa area yang dilindungi server.
Jadi mari kita mulai?
Pertama, atur variabel skrip Anda:
#! / bin / bash
#
# Script untuk memeriksa level rata-rata beban sistem untuk mencoba menentukan
# proses apa yang membuatnya terlalu tinggi ...
#
# 07Jul2010 tjones
#
# atur lingkungan
dt = "date +% d% b% Y-% X"
# Jelas, ubah direktori berikut ke tempat file log Anda sebenarnya disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# mailstop pertama adalah email standar untuk laporan. Yang kedua adalah untuk ponsel (dengan laporan yang dikupas)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Tiga berikut adalah untuk penggunaan mytop - gunakan pengguna db yang memiliki hak yang layak
dbusr = "nama pengguna"
dbpw = "kata sandi"
db = "yourdatabasename"
# Berikut ini adalah level muatan yang harus diperiksa - 10 sangat tinggi, jadi Anda mungkin ingin menurunkannya.
levelToCheck = 10
Selanjutnya, periksa level muat Anda untuk melihat apakah skrip harus dilanjutkan:
# Atur variabel dari sistem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jika level beban lebih besar dari yang Anda inginkan, mulailah proses skrip. Jika tidak, keluar 0
if [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
gema "Tanggal: $ dt" >> $ tmpfile
echo "Periksa Pemuatan & Proses Sistem" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Dan lanjutkan melalui pemeriksaan, menulis hasilnya ke file sementara. Tambahkan atau hapus item dari sini yang sesuai dengan situasi Anda:
# Dapatkan lebih banyak variabel dari sistem:
httpdProcess = "ps -def | grep httpd | grep -v grep | wc -l"# Tampilkan level beban saat ini:
echo "Level Muat: $ loadLevel" >> $ tmpfile
echo "********************************************** * ">> $ tmpfile# Tampilkan jumlah proses httpd yang sekarang berjalan (tidak termasuk anak-anak):
echo "Jumlah proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan daftar proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan info MySQL saat ini:
gema "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile
Perhatikan dengan perintah atas, kami menulis ke dua file temp. Salah satunya adalah untuk pesan yang jauh lebih kecil ke ponsel. Jika Anda tidak ingin urgensi peringatan ponsel pada pukul tiga dini hari, Anda dapat menghapusnya (dan menghapus rutinitas pengiriman surat kedua nanti dalam skrip).
# Tampilkan top saat ini:
echo "top now menunjukkan:" >> $ tmpfile
echo "top now menunjukkan:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile
Lebih banyak cek:
# Tampilkan koneksi saat ini:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Periksa ruang disk
echo "ruang disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile
Kemudian tulis konten file sementara ke file log yang lebih permanen dan kirim hasilnya melalui email ke pihak yang sesuai. Mailing kedua adalah hasil yang dikupas yang hanya terdiri dari standar dari 'atas':
# Kirim hasil ke file log:
/ bin / cat $ tmpfile >> $ logfile# Dan hasil email ke sysadmin:
/ usr / bin / mutt -s "$ machine memiliki tingkat beban tinggi! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile
Dan kemudian beberapa housekeeping dan keluar:
# Dan kemudian hapus file temp:
rm $ tmpfile
rm $ topfile
fi#
keluar 0
Semoga ini bisa membantu seseorang di luar sana. Skrip yang dirakit sepenuhnya adalah:
#! / bin / bash
#
# Script untuk memeriksa level rata-rata beban sistem untuk mencoba menentukan proses apa
# menganggapnya terlalu tinggi ...
#
# atur lingkungan
dt = "date +% d% b% Y-% X"
# Jelas, ubah direktori berikut ke tempat file log Anda sebenarnya disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / messages"
mysqlLog = "/ var / log / mysqld.log"
# mailstop pertama adalah email standar untuk laporan. Yang kedua adalah untuk ponsel (dengan laporan yang dikupas)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
machine = "hostname"
# Tiga berikut adalah untuk penggunaan mytop - gunakan pengguna db yang memiliki hak yang layak
dbusr = "nama pengguna"
dbpw = "kata sandi"
db = "yourdatabasename"
# Berikut ini adalah level muatan yang harus diperiksa - 10 sangat tinggi, jadi Anda mungkin ingin menurunkannya.
levelToCheck = 10
# Atur variabel dari sistem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jika level beban lebih besar dari yang Anda inginkan, mulailah proses skrip. Jika tidak, keluar 0
if [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
gema "Tanggal: $ dt" >> $ tmpfile
echo "Periksa Pemuatan & Proses Sistem" >> $ tmpfile
echo "**************************************" >> >> $ tmpfile# Dapatkan lebih banyak variabel dari sistem:
httpdProcess = "ps -def | grep httpd | grep -v grep | wc -l"# Tampilkan level beban saat ini:
echo "Level Muat: $ loadLevel" >> $ tmpfile
echo "********************************************** * ">> $ tmpfile# Tampilkan jumlah proses httpd yang sekarang berjalan (tidak termasuk anak-anak):
echo "Jumlah proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan daftar proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan info MySQL saat ini:
gema "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan top saat ini:
echo "top now menunjukkan:" >> $ tmpfile
echo "top now menunjukkan:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Tampilkan koneksi saat ini:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Periksa ruang disk
echo "ruang disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "********************************************** * ">> $ tmpfile
gema "" >> $ tmpfile# Kirim hasil ke file log:
/ bin / cat $ tmpfile >> $ logfile# Dan hasil email ke sysadmin:
/ usr / bin / mutt -s "$ machine memiliki tingkat beban tinggi! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Dan kemudian hapus file temp:
rm $ tmpfile
rm $ topfile
fi#
keluar 0