Mengesan Masalah Beban Server Linux dengan Skrip Mudah
Sekiranya anda telah menjadi seorang pentadbir untuk tempoh masa yang panjang, anda pasti telah menemui situasi di mana penggunaan pancang pelayan dalam penggunaan CPU atau penggunaan memori dan / atau tahap beban. Running 'top' tidak akan selalu memberi anda jawapan, sama ada. Jadi, bagaimanakah anda mencari proses yang licik yang mengunyah sumber sistem anda supaya dapat membunuh mereka?
Skrip berikut mungkin dapat membantu. Ia ditulis untuk pelayan web, jadi ada beberapa bahagian yang khusus mencari proses httpd dan beberapa bahagian yang berurusan dengan MySQL. Bergantung kepada penggunaan pelayan anda, semak komen / memadam bahagian tersebut dan tambahkan lain-lain. Ia harus digunakan untuk titik permulaan.
Prasyarat untuk skrip versi ini adalah beberapa perisian percuma dikeluarkan di bawah GNU General Public License yang dipanggil mytop (boleh didapati di http://jeremy.zawodny.com/mysql/mytop/) yang merupakan alat yang hebat untuk menyemak bagaimana MySQL berfungsi. Ia semakin tua, tetapi masih berfungsi hebat untuk keperluan kita di sini.
Di samping itu, saya menggunakan mutt sebagai pengirim - anda mungkin mahu mengubah skrip untuk hanya menggunakan linux yang dibina menggunakan 'mel'. Saya menjalankannya melalui cron setiap jam; menyesuaikan diri seperti yang anda lihat patut. Oh - dan skrip ini perlu dijalankan sebagai root kerana ia tidak dibaca dari beberapa kawasan yang dilindungi pelayan.
Jadi mari kita mulakan, bolehkah kita?
Pertama, tentukan pemboleh ubah skrip anda:
#! / bin / bash
#
# Skrip untuk memeriksa tahap purata beban sistem untuk cuba ditentukan
# apa proses yang mengambilnya terlalu tinggi ...
#
# 07Jul2010 tjones
#
# persekitaran set
dt = "tarikh +% d% b% Y-% X"
# Tentunya, ubah direktori berikut ke mana fail log anda sebenarnya disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / mesej"
mysqlLog = "/ var / log / mysqld.log"
# firststop pertama adalah e-mel standard untuk laporan. Yang kedua adalah untuk telefon bimbit (dengan laporan bawah)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
mesin = "nama hos"
# Tiga berikut adalah untuk penggunaan mytop - gunakan pengguna db yang mempunyai hak yang layak
dbusr = "username"
dbpw = "kata laluan"
db = "yourdatabasename"
# Berikut ialah tahap beban untuk memeriksa - 10 adalah sangat tinggi, jadi anda mungkin ingin menurunkannya.
levelToCheck = 10
Seterusnya, semak tahap beban anda untuk mengetahui sama ada skrip itu perlu diteruskan:
# Tetapkan pemboleh ubah dari sistem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jika tahap beban lebih besar daripada yang anda inginkan, mulakan proses skrip. Jika tidak, keluar 0
jika [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Load System Load & Processes" >> $ tmpfile
echo "**************************************" >> $ tmpfile
Dan teruskan cek, menulis hasilnya ke fail sementara. Tambah atau hapus item dari sini jika terpakai kepada situasi anda:
# Dapatkan lebih banyak pemboleh ubah dari sistem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Tunjukkan tahap beban semasa:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Tunjukkan bilangan proses httpd yang sedang berjalan (tidak termasuk kanak-kanak):
echo "Bilangan proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Paparkan senarai proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Paparkan maklumat MySQL semasa:
echo "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Perhatikan dengan arahan atas, kami menulis kepada dua fail temp. Satu adalah untuk mesej yang lebih kecil ke telefon bimbit. Sekiranya anda tidak mahu peringatan telefon bimbit pada pukul 3 pagi, anda boleh mengambilnya (dan mengambil rutin mel kedua dalam skrip).
# Tunjukkan atas semasa:
echo "atas sekarang menunjukkan:" >> $ tmpfile
echo "atas sekarang menunjukkan:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Lebih cek:
# Tunjukkan sambungan semasa:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Periksa ruang cakera
echo "space disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile
Kemudian tulis kandungan fail sementara ke fail log yang lebih kekal dan e-melkan hasilnya kepada pihak yang sesuai. Mailing kedua adalah hasil keputusan yang terdiri daripada standard dari 'atas':
# Menghantar keputusan ke file log:
/ bin / cat $ tmpfile >> $ logfile# Dan keputusan e-mel kepada sysadmin:
/ usr / bin / mutt -s "mesin $ mempunyai tahap 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 pengemasan dan keluar:
# Dan kemudian keluarkan fail temp:
rm $ tmpfile
rm $ topfile
fi#
keluar 0
Semoga ini membantu seseorang di luar sana. Skrip yang dipasang sepenuhnya ialah:
#! / bin / bash
#
# Skrip untuk memeriksa tahap purata beban sistem untuk cuba menentukan proses apa
# mengambilnya terlalu tinggi ...
#
# persekitaran set
dt = "tarikh +% d% b% Y-% X"
# Tentunya, ubah direktori berikut ke mana fail log anda sebenarnya disimpan
tmpfile = "/ tmp / checkSystemLoad.tmp"
logfile = "/ tmp / checkSystemLoad.log"
msgLog = "/ var / log / mesej"
mysqlLog = "/ var / log / mysqld.log"
# firststop pertama adalah e-mel standard untuk laporan. Yang kedua adalah untuk telefon bimbit (dengan laporan bawah)
mailstop = "[email protected]"
mailstop1 = "[email protected]"
mesin = "nama hos"
# Tiga berikut adalah untuk penggunaan mytop - gunakan pengguna db yang mempunyai hak yang layak
dbusr = "username"
dbpw = "kata laluan"
db = "yourdatabasename"
# Berikut ialah tahap beban untuk memeriksa - 10 adalah sangat tinggi, jadi anda mungkin ingin menurunkannya.
levelToCheck = 10
# Tetapkan pemboleh ubah dari sistem:
loadLevel = "cat / proc / loadavg | awk" print $ 1 "
loadLevel = $ (printf "% 0.f" $ loadLevel)# jika tahap beban lebih besar daripada yang anda inginkan, mulakan proses skrip. Jika tidak, keluar 0
jika [$ loadLevel -gt $ levelToCheck]; kemudian
echo ""> $ tmpfile
echo "**************************************" >> $ tmpfile
echo "Date: $ dt" >> $ tmpfile
echo "Load System Load & Processes" >> $ tmpfile
echo "**************************************" >> $ tmpfile# Dapatkan lebih banyak pemboleh ubah dari sistem:
httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"# Tunjukkan tahap beban semasa:
echo "Load Level Is: $ loadLevel" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile# Tunjukkan bilangan proses httpd yang sedang berjalan (tidak termasuk kanak-kanak):
echo "Bilangan proses httpd sekarang: $ httpdProcesses" >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Paparkan senarai proses:
echo "Proses sekarang berjalan:" >> $ tmpfile
ps f -ef >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Paparkan maklumat MySQL semasa:
echo "Hasil dari mytop:" >> $ tmpfile
/ usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tunjukkan atas semasa:
echo "atas sekarang menunjukkan:" >> $ tmpfile
echo "atas sekarang menunjukkan:" >> $ topfile
/ usr / bin / top -b -n1 >> $ tmpfile
/ usr / bin / top -b -n1 >> $ topfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Tunjukkan sambungan semasa:
echo "netstat sekarang menunjukkan:" >> $ tmpfile
/ bin / netstat -p >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Periksa ruang cakera
echo "space disk:" >> $ tmpfile
/ bin / df -k >> $ tmpfile
echo "************************************************ * ">> $ tmpfile
echo "" >> $ tmpfile# Menghantar keputusan ke file log:
/ bin / cat $ tmpfile >> $ logfile# Dan keputusan e-mel kepada sysadmin:
/ usr / bin / mutt -s "mesin $ mempunyai tahap beban tinggi! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ logfile# Dan kemudian keluarkan fail temp:
rm $ tmpfile
rm $ topfile
fi#
keluar 0