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

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

Утилита top и интерпретация ее вывода

Вся работа осуществляется только при подключении по протоколу SSH.

Сначала рекомендуем запустить самую стандартную утилиту top. Внешний вид утилиты следующий:

Внешний вид утилиты op

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

Она выглядит следующим образом: Внешний вид htop

Более подробно об этой утилите можно почитать тут.

Также эффективна команда atop -r, используя клавиши T и Shift+T можно смотреть историю работы сервера.

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

atop -dD

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

iftop

Командой kill можно остановить конкретный процесс, указав его PID. Команда killall -9 apache2, к примеру, завершит все процессы Apache на сервере Команда killall -u user завершит все процессы пользователя user.

Для того, чтобы посмотреть что происходило на сервере в прошедшем времени и к примеру из-за чего сервер завис, нужно посмотреть логи сервера в папке var/log, в частности рекомендуем к просмотру системные логи syslog, kernal, atop и логи сервисов, которые зависли, к примеру: apache2, nginx, mysql и другие.

Также, если на сервере установлен веб-сервис Nginx и размещены сайты, с помощью следующей команды можно вывести список сайтов, на который поступило больше всего запросов:

  1. tail -n 10000 /var/log/nginx/access.log | awk '{print $6}' | sort -n | uniq -c | sort -nr | head -n10

Следующая команда выведет список IP с которых поступило больше всего запросов:

  1. tail -n 10000 /var/log/nginx/access.log | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -n10

Следующий пример команды заблокирует доступ к серверу для IP 1.1.1.1

  1. iptables -I INPUT -s 1.1.1.1 -j REJECT

Более подробно о работе с iptables можно прочесть тут.