8.9 Как определить что создает нагрузку на сервер UNIX
Указанная статья актуальна только для услуг виртуальных и выделенных серверов с ОС Linux и c уровнем доступа root. На виртуальном хостинге и на серверах ОС семейства Windows указанное выполнить нет возможности.
Вся работа осуществляется только при подключении по протоколу SSH: https://thehost.ua/wiki/ssh-connect
Сначала рекомендуем запустить самую стандартную утилиту 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 — команда, запустившая процесс.
Дополнительная информация есть также на сайте - https://ru.wikipedia.org/wiki/Top
Также можно использовать альтернативную утилиту htop
Внешний вид ее следующий:
Боле подробно об этой утилите можно почитать тут - https://ru.wikipedia.org/wiki/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 можно прочесть тут - http://help.ubuntu.ru/wiki/iptables