Как определить что создает нагрузку на сервер UNIX

Указанная статья актуальна только для услуг виртуальных и выделенных серверов с ОС Linux и c уровнем доступа root. На виртуальном хостинге и на серверах ОС семейства Windows указанное выполнить нет возможности.

Вся работа осуществляется только при подключении по протоколу SSH: https://thehost.ua/wiki/ssh-connect

Сначала рекомендуем запустить самую стандартную утилиту top

Внешний вид утилиты следующий:

IMG ALT TEXT

В верхней строке слева на право указано текущее системное время сервера после 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

Внешний вид ее следующий:

IMG ALT TEXT

Боле подробно об этой утилите можно почитать тут - https://ru.wikipedia.org/wiki/Htop

В случае если в top имеется большой показатель wa, стоит воспользоваться утилитой atop -dD для подробного определения нагрузки на диски, raid-массивы и сеть:

IMG ALT TEXT

Если процент загрузки сети в atop (eth0 на примере выше) большой, с помощью утилиты iftop можно определить какие сайты и удаленные сервера собственно создают трафик

IMG ALT TEXT

Командой 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
можно вывести список сайтов, на который поступило больше всего запросов.

Команда:
tail -n 10000 /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -n10
выведет список IP с которых поступило больше всего запросов

Команда:
iptables -I INPUT -s 1.1.1.1 -j REJECT
заблокирует доступ к серверу для IP 1.1.1.1

Более подробно о работе с iptables можно прочесть тут - http://help.ubuntu.ru/wiki/iptables