8.9 Как определить что создает нагрузку на сервер UNIX
Учтите: указанная статья актуальна только для услуг виртуальных и выделенных серверов с ОС Linux и c уровнем доступа root. На виртуальном хостинге и на серверах ОС семейства Windows указанное выполнить нет возможности.
Утилита top и интерпретация ее вывода
Вся работа осуществляется только при подключении по протоколу SSH.
Сначала рекомендуем запустить самую стандартную утилиту top
. Внешний вид утилиты следующий:
В верхней строке слева на право указано текущее системное время сервера после top, затем время работы сервера онлайн и количество пользователей в данный момент.
Важным показателем является load average который показывает усредненную загрузку всех подсистем сервера в текущий момент, за последние 15 минут и за последний час. Стоит отметить что этот показатель не должен превышать количество ядер сервера, то есть для 1-ядерного CPU - номинальная нагрузка - 1, для 2-х ядерного - 2 и т.д.
В строчке Tasks указано количество запущенных заданий на сервере с разбивкой по их состоянию.
В строчке CPU указано:
us
— (User CPU time) время, затраченное на работу программ пользователейsy
— (System CPU time) время, затраченное на работу процессов ядраni
— (Nice CPU time) время, затраченное на работу программ с измененным приоритетомid
— простой процессораwa
— (iowait) время, затраченное на завершение ввода-выводаhi
— (Hardware IRQ) время, затраченное на обработку hardware-прерыванийsi
— (Software Interrupts) время, затраченное на работу обработку software-прерываний (network)st
— (Steal Time) время, «украденное» гипервизором у этой виртуальной машины для других задач (например работа другой виртуальной машины)
В строчках MEM
и SWAP
указано доступный размер оперативной памяти/файла подкачки, используемый обьем, свободный обьем и обьем буферезированной/кешированной памяти.
Программа с частотой обновления в 2 секунды показывает текущую активность процессов в виде таблицы.
Стандартные колонки:
PID
— идентификатор процессаUSER
— пользователь, от которого запущен процессPR
— текущий приоритет процессаNI
— приоритет, выставленный командой nice. От −20 (наивысший) до 19.VIRT
— полный объем виртуальной памяти, которую занимает процессRES
— текущее использование оперативной памятиS
— текущее состояние («START», «RUN» (только в этом состоянии показывает текущую нагрузку программы на процессор), «SLEEP», «STOP», «ZOMB», «WAIT» или «LOCK»)%CPU
— процент доступного времени процессора, которое использовала запущенная программа%MEM
— процент использования оперативной памяти данным процессомTIME
— время использования процессора в секундахCOMMAND
— команда, запустившая процесс.
Дополнительная информация есть также на сайте.
Альтернативные варианты вывода и диагностики нагрузки
Также можно использовать альтернативную утилиту htop.
Она выглядит следующим образом:
Более подробно об этой утилите можно почитать тут.
Также эффективна команда atop -r
, используя клавиши T и Shift+T можно смотреть историю работы сервера.
В случае если в top
имеется большой показатель wa
, стоит воспользоваться утилитой atop -dD
для подробного определения нагрузки на диски, raid-массивы и сеть:
Если процент загрузки сети в atop (eth0 на примере выше) большой, с помощью утилиты iftop можно определить какие сайты и удаленные сервера, собственно, создают трафик:
Командой kill
можно остановить конкретный процесс, указав его PID.
Команда killall -9 apache2
, к примеру, завершит все процессы Apache на сервере
Команда killall -u user
завершит все процессы пользователя user
.
Для того, чтобы посмотреть что происходило на сервере в прошедшем времени и к примеру из-за чего сервер завис, нужно посмотреть логи сервера в папке var/log, в частности рекомендуем к просмотру системные логи syslog, kernal, atop и логи сервисов, которые зависли, к примеру: apache2, nginx, mysql и другие.
Также, если на сервере установлен веб-сервис Nginx и размещены сайты, с помощью следующей команды можно вывести список сайтов, на который поступило больше всего запросов:
- tail -n 10000 /var/log/nginx/access.log | awk '{print $6}' | sort -n | uniq -c | sort -nr | head -n10
Следующая команда выведет список IP с которых поступило больше всего запросов:
- tail -n 10000 /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -n10
Следующий пример команды заблокирует доступ к серверу для IP 1.1.1.1
- iptables -I INPUT -s 1.1.1.1 -j REJECT
Более подробно о работе с iptables можно прочесть тут.