Домашняя » как » Диагностика проблем загрузки сервера Linux с помощью простого скрипта

    Диагностика проблем загрузки сервера Linux с помощью простого скрипта

    Если вы были администратором в течение какого-то промежутка времени, вы наверняка обнаружили ситуации, когда сервер резко увеличивает загрузку ЦП, использование памяти и / или уровни нагрузки. Запуск top не всегда даст вам ответ. Итак, как вы находите те подлые процессы, которые поглощают ваши системные ресурсы, чтобы убивать их??

    Следующий скрипт может помочь. Он был написан для веб-сервера, поэтому некоторые его части специально предназначены для процессов httpd, а некоторые - для работы с MySQL. В зависимости от вашего сервера, просто закомментируйте / удалите эти разделы и добавьте другие. Это должно быть использовано в качестве отправной точки.

    Необходимыми условиями для этой версии скрипта является бесплатное программное обеспечение, выпущенное под общедоступной лицензией GNU под названием mytop (доступно по адресу http://jeremy.zawodny.com/mysql/mytop/), которое является фантастическим инструментом для проверки работы MySQL. Это стареет, но все еще отлично работает для наших целей здесь.
    Кроме того, я использую mutt в качестве почтовой программы - вы можете изменить скрипт, чтобы просто использовать встроенную в Linux утилиту 'mail'. Я запускаю его через cron каждый час; отрегулируйте так, как считаете нужным. О - и этот скрипт должен запускаться с правами root, поскольку он читает из некоторых защищенных областей сервера.

    Итак, начнем?

    Сначала установите переменные вашего скрипта:

    #! / Bin / Баш
    #
    # Скрипт для проверки средних уровней загрузки системы, чтобы попытаться определить
    # какие процессы принимают это слишком высоко ...
    #
    # 07Jul2010 Tjones
    #
    # установить среду
    dt = "дата +% d% b% Y-% X"
    # Очевидно, измените следующие каталоги, где на самом деле хранятся ваши файлы журналов
    tmpfile = "/ TMP / checkSystemLoad.tmp"
    файл_журнал = "/ TMP / checkSystemLoad.log"
    msgLog = "/ вар / Журнал / сообщения"
    mysqlLog = "/ Var / Журнал / mysqld.log"
    # первая почтовая остановка - это стандартная электронная почта для отчетов. Второй для мобильного телефона (с урезанным отчетом)
    Mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    машина = «имя хоста»
    # Следующие три предназначены для использования mytop - используйте пользователя БД, который имеет приличные права
    dbusr = "имя пользователя"
    dbpw = "пароль"
    дб = «имя_базы_данный»
    # Ниже приведен уровень загрузки для проверки - 10 действительно высокий, так что вы можете понизить его.
    levelToCheck = 10

    Далее, проверьте уровень загрузки, чтобы увидеть, должен ли скрипт продолжаться:

    # Установить переменные из системы:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # если уровень загрузки выше, чем вы хотите, запустите процесс сценария. В противном случае выход 0

    if [$ loadLevel -gt $ levelToCheck]; затем
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Date: $ dt" >> $ tmpfile
    echo "Проверка загрузки системы и процессов" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    И продолжайте проверку, записывая результаты во временный файл. Добавьте или удалите элементы отсюда, где это применимо к вашей ситуации:

    # Получить больше переменных из системы:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Показать текущий уровень нагрузки:
    echo "Уровень загрузки Is: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Показать количество запущенных процессов httpd (не включая детей):
    echo "Количество процессов httpd сейчас: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать список процессов:
    echo "Процессы сейчас запущены:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать текущую информацию MySQL:
    echo "Результаты из mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Обратите внимание, что с помощью команды top мы записываем в два временных файла. Один для гораздо меньшего сообщения на мобильный телефон. Если вы не хотите, чтобы оповещения по мобильному телефону были срочными в три часа утра, вы можете убрать это (и выньте вторую процедуру рассылки позже в сценарии).


    # Показать текущую вершину:
    echo "top теперь показывает:" >> $ tmpfile
    echo "top теперь показывает:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Больше проверок:


    # Показать текущие соединения:
    echo "netstat теперь показывает:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Проверьте место на диске
    echo "дисковое пространство:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    Затем запишите содержимое временного файла в более постоянный файл журнала и отправьте результаты по электронной почте соответствующим сторонам. Второе почтовое сообщение - это урезанные результаты, состоящие просто из стандартного «top»:

    # Отправить результаты в файл журнала:
    / bin / cat $ tmpfile >> $ logfile

    # И отправьте результаты по электронной почте системному администратору:
    / usr / bin / mutt -s "$ машина имеет высокий уровень загрузки! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ файл_журнала

    А потом какая-то уборка и выход:

    # А затем удалите временный файл:
    rm $ tmpfile
    RM $ topfile
    фи

    #
    выход 0

    Надеюсь, это поможет кому-то там. Полностью собранный скрипт это:

    #! / Bin / Баш
    #
    # Скрипт для проверки средних уровней загрузки системы, чтобы попытаться определить, какие процессы
    # принимая это слишком высоко ...
    #
    # установить среду
    dt = "дата +% d% b% Y-% X"
    # Очевидно, измените следующие каталоги, где на самом деле хранятся ваши файлы журналов
    tmpfile = "/ TMP / checkSystemLoad.tmp"
    файл_журнал = "/ TMP / checkSystemLoad.log"
    msgLog = "/ вар / Журнал / сообщения"
    mysqlLog = "/ Var / Журнал / mysqld.log"
    # первая почтовая остановка - это стандартная электронная почта для отчетов. Второй для мобильного телефона (с урезанным отчетом)
    Mailstop = "[email protected]"
    mailstop1 = "[email protected]"
    машина = «имя хоста»
    # Следующие три предназначены для использования mytop - используйте пользователя БД, который имеет приличные права
    dbusr = "имя пользователя"
    dbpw = "пароль"
    дб = «имя_базы_данный»
    # Ниже приведен уровень загрузки для проверки - 10 действительно высокий, так что вы можете понизить его.
    levelToCheck = 10
    # Установить переменные из системы:
    loadLevel = "cat / proc / loadavg | awk" print $ 1 "
    loadLevel = $ (printf "% 0.f" $ loadLevel)

    # если уровень загрузки выше, чем вы хотите, запустите процесс сценария. В противном случае выход 0

    if [$ loadLevel -gt $ levelToCheck]; затем
    echo ""> $ tmpfile
    echo "**************************************" >> $ tmpfile
    echo "Date: $ dt" >> $ tmpfile
    echo "Проверка загрузки системы и процессов" >> $ tmpfile
    echo "**************************************" >> $ tmpfile

    # Получить больше переменных из системы:
    httpdProcesses = "ps -def | grep httpd | grep -v grep | wc -l"

    # Показать текущий уровень нагрузки:
    echo "Уровень загрузки Is: $ loadLevel" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile

    # Показать количество запущенных процессов httpd (не включая детей):
    echo "Количество процессов httpd сейчас: $ httpdProcesses" >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать список процессов:
    echo "Процессы сейчас запущены:" >> $ tmpfile
    ps f -ef >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать текущую информацию MySQL:
    echo "Результаты из mytop:" >> $ tmpfile
    / usr / bin / mytop -u $ dbusr -p $ dbpw -b -d $ db >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать текущую вершину:
    echo "top теперь показывает:" >> $ tmpfile
    echo "top теперь показывает:" >> $ topfile
    / usr / bin / top -b -n1 >> $ tmpfile
    / usr / bin / top -b -n1 >> $ topfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Показать текущие соединения:
    echo "netstat теперь показывает:" >> $ tmpfile
    / bin / netstat -p >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Проверьте место на диске
    echo "дисковое пространство:" >> $ tmpfile
    / bin / df -k >> $ tmpfile
    echo "************************************************* * ">> $ tmpfile
    echo "" >> $ tmpfile

    # Отправить результаты в файл журнала:
    / bin / cat $ tmpfile >> $ logfile

    # И отправьте результаты по электронной почте системному администратору:
    / usr / bin / mutt -s "$ машина имеет высокий уровень загрузки! - $ dt" -a $ mysqlLog -a $ msgLog $ mailstop <$tmpfile /usr/bin/mutt -s "$machine has a high load level! - $dt" $mailstop1 >$ файл_журнала

    # А затем удалите временный файл:
    rm $ tmpfile
    RM $ topfile
    фи

    #
    выход 0