Laman » bagaimana untuk » Mengesan Masalah Beban Server Linux dengan Skrip Mudah

    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