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

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

Видео: Диагностировать проблемы загрузки сервера Linux с помощью простого сценария

Видео: Диагностировать проблемы загрузки сервера Linux с помощью простого сценария
Видео: Не приходят уведомления Gmail - Что делать - YouTube 2024, Май
Anonim

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

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

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

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

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

#!/bin/bash # # Script to check system load average levels to try to determine # what processes are taking it overly high… # # 07Jul2010 tjones # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10

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

# Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

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

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

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

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

Дополнительные проверки:

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

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

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

И затем некоторое хозяйство и выход:

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

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

#!/bin/bash # # Script to check system load average levels to try to determine what processes are # taking it overly high… # # set environment dt=`date +%d%b%Y-%X` # Obviously, change the following directories to where your log files actually are kept tmpfile='/tmp/checkSystemLoad.tmp' logfile='/tmp/checkSystemLoad.log' msgLog='/var/log/messages' mysqlLog='/var/log/mysqld.log' # the first mailstop is standard email for reports. Second one is for cell phone (with a pared down report) mailstop='[email protected]' mailstop1='[email protected]' machine=`hostname` # The following three are for mytop use - use a db user that has decent rights dbusr='username' dbpw='password' db='yourdatabasename' # The following is the load level to check on - 10 is really high, so you might want to lower it. levelToCheck=10 # Set variables from system: loadLevel=`cat /proc/loadavg | awk '{print $1}'` loadLevel=$( printf '%0.f' $loadLevel )

# if the load level is greater than you want, start the script process. Otherwise, exit 0

if [ $loadLevel -gt $levelToCheck ]; then echo '' > $tmpfile echo '**************************************' >>$tmpfile echo 'Date: $dt ' >>$tmpfile echo 'Check System Load & Processes ' >>$tmpfile echo '**************************************' >>$tmpfile

# Get more variables from system: httpdProcesses=`ps -def | grep httpd | grep -v grep | wc -l`

# Show current load level: echo 'Load Level Is: $loadLevel' >>$tmpfile echo '*************************************************' >>$tmpfile

# Show number of httpd processes now running (not including children): echo 'Number of httpd processes now: $httpdProcesses' >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show process list: echo 'Processes now running:' >>$tmpfile ps f -ef >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current MySQL info: echo 'Results from mytop:' >>$tmpfile /usr/bin/mytop -u $dbusr -p $dbpw -b -d $db >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current top: echo 'top now shows:' >>$tmpfile echo 'top now shows:' >>$topfile /usr/bin/top -b -n1 >>$tmpfile /usr/bin/top -b -n1 >>$topfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Show current connections: echo 'netstat now shows:' >>$tmpfile /bin/netstat -p >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Check disk space echo 'disk space:' >>$tmpfile /bin/df -k >>$tmpfile echo '*************************************************' >>$tmpfile echo '' >>$tmpfile

# Send results to log file: /bin/cat $tmpfile >>$logfile

# And email results to sysadmin: /usr/bin/mutt -s '$machine has a high load level! - $dt' -a $mysqlLog -a $msgLog $mailstop <$tmpfile /usr/bin/mutt -s '$machine has a high load level! - $dt' $mailstop1 <$topfile echo '**************************************' >>$logfile

# And then remove the temp file: rm $tmpfile rm $topfile fi

# exit 0

Рекомендуемые: