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

Указанная статья актуальна только для услуг виртуальных и выделенных серверов с ОС UNIX/Linux c уровнем доступа root, на хостинге и на серверах с ОС семейства Windows указанное выполнить нет возможности.
Вся работа осуществляется только при подключении root ssh http://thehost.ua/wiki/ssh-connect к серверу.

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

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

IMG ALT TEXT

В верхней строке слева на право указано текущее системное время сервера после top, затем время работы сервера онлайн после up и количество пользователей онлайн в данный момент
Важным показателем является 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 -I INPUT -p TCP --dport 80 -m string --string "domain.ua" --algo bm --to 1024 --icase -m string --string "doska/6975.php" --algo bm --to 1024 --icase -j DROP

можно заблокировать работу страницы domain.ua/doska/6975 на сервере

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

http://help.ubuntu.ru/wiki/iptables