Beranda » bagaimana » Diagnosis Masalah Pemuatan Server Linux dengan Skrip Sederhana

    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