Анализ работы сервера linux
Применимость: Linux
Слова для поиска: тормозит, висит, зависает, глючит
Задача:
Что делать если сервер перегружен, тормозит, работает недостаточно быстро
Решение:
Обычная причина - нехватка каких либо ресурсов.
Используйте доступные вам средства получения нужной информации о работе системы
CPU
Проверьте количество, параметры и мощность ваших процессоров:
cat /proc/cpuinfo
Список из 30 процессов, которые больше всего нагружают процессор:
ps aux --sort=-%cpu | head -31
В динамике увидеть список самых прожорливых процессов можно командой top
Для более подробной информации установите и используйте htop
Память
Команда free показывает в килобайтах общее количество свободной и используемой системой физической памяти и памяти SWAP, а также размеры буферов, используемые ядром.
free total used free shared buffers cached Mem: 962568 734924 227644 0 29040 251592 -/+ buffers/cache: 454292 508276 Swap: 1461872 326604 1135268
Примечание: Для виртуальных серверов распределение (выделение) памяти выполняется ядром несущей машины (hardware node-HN).
Виртуальная память (swap) для Вашей VPS выделяется, но Вы этого не видите стандартными средствами.
Использование виртуальной памяти (swap) не отображается внутрь VPS в текущей версии Virtuozzo (В будущем это будет возможно). Для VPS выделяется просто память, и внутри VPS не показывается различие между swap и остальной памятью, поэтому в /proc/meminfo (а также в top/free) мы наблюдаем нулевой размер и нулевое использование swap.
Но есть важный момент - если не хватает памяти на выделенном сервере, то процессы вытесняются в виртуальную память, что тормозит работу и это автоматически снижает нагрузку.
Топ прожорливых к памяти процессов
ps aux --sort=-rssize | head -20
Есть возможность получить виртуальный размер процесса и резидентный, я предлагаю измерять резидентный - то что реально получает процесс от ядра. Однако есть смысл отсортировать и по виртуальному размеру - то, что процесс просит у ядра, но не получает.
ps aux --sort=-vsz | head -20
Дополнительно используйте top, htop с сортировкой по памяти
Диск
Система может просто висеть по причине переполненного диска. Проверьте сколько места у вас имеется:
df -h Filesystem Size Used Avail Use% Mounted on /dev/simfs 217G 149G 69G 69% /
При недостатке индексных дискрипоторов тоже будут проблемы. Убедитесь, что есть резерв:
df -i Filesystem Inodes IUsed IFree IUse% Mounted on /dev/simfs 4.8M 1.7M 3.2M 35% /
Как видно, занято только 35%. Сообщите службе технической поддержки провайдера если выделенный лимит исчерпан.
Чаще всего пожирателем пространства бывают системные журналы, уделите время настройке ротации журналов.
А эта команда покажет кто съел пространство (для всего диска используем для указания каталога «/»):
du <имя каталога>| sort -rn | head -n 20
При этом будет вычислен общий объем имеющегося у вас пространства, а также объем, занимаемый каждым каталогом, затем результат сортируется по убыванию объемов и, наконец, показываются только первые 20 строк упорядоченного списка. Подобные команды позволяют вам определить, кто является «пожирателем пространства», но оставляют на ваше усмотрение способы решения этой проблемы.
Чтобы узнать размер всех директорий в заданном каталоге, выполните команду:
find <путь к каталогу> -maxdepth 1 -type d -print | xargs du -sk | sort -rn
Для поиска больших файлов можно использовать find
find <путь к каталогу> -type f -size +100M
эта команда выдаст список файлов с размером более 100М
Команду можно развить до конструкции, выполняющей действия над найденными файлами:
find <путь к каталогу> <опции поиска> <команда> {} \;
На место симвовлов «{}» будут подставлены имена найденных файлов.
Подобная конструкция может вам скомрессировать или удалить ненужные файлы.
Только прежде хорошо анализируйте, что сочинили, - команда не будет задавать вопросы даже если возмётся удалять всё с вашего диска.
I/O нагрузка
Ваша система может сильно тормозить если постоянно находится в ожидании ввода/вывода данных. Это происходит при большой нагрузке (утилизации) устройств хранения, каналов связи и т.п. Команда iostat выдает статистику использования процессора, а также статистику ввода/вывода для устройств, разделов и сетевых файловых систем (NFS). В таком варианте она выдает параметры с интервалом 5 секунд
iostat -x 5 Linux 2.6.18-028stab053 (vt.helpdesk.by) 10/29/09 avg-cpu: %user %nice %system %iowait %steal %idle 13.52 1.55 3.75 33.44 0.00 47.74 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util
На физическом сервере это выглядит так:
iostat -x 5 Linux 2.6.30-gentoo-r6 (k-pex) 29.10.2009 _x86_64_ (1 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 19.86 17.72 6.46 3.69 0.00 52.28 Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s avgrq-sz avgqu-sz await svctm %util sda 2.56 18.96 8.75 3.30 272.31 178.44 37.41 0.42 34.94 3.62 4.37 sdb 0.21 36.96 2.90 2.29 354.28 265.58 119.26 0.67 128.36 5.60 2.91
Сеть
Проблемы производительности связанные с сетью могут быть вызваны неверными настройками, например так могут влиять неправильные параметры в файлах:
/etc/hosts /etc/resolv.conf /etc/nsswitch.conf
Проверьте проверьте правильность назначения имени хоста
domainname -f
Вы должны получить имя подобное этому
server1.domain.com
Для проверки работы DNS
Проверка прямого разрешения имени хоста:
host helpdesk.by helpdesk.by has address 87.118.96.217
Проверка обратного разрешения имени хоста:
host 87.118.96.217 217.96.118.87.in-addr.arpa domain name pointer helpdesk.by.
Проверить канал до сервера командами
ping -c 4 87.118.96.217 traceroute -n 87.118.96.217
Если трассировка не прошла, значит вероятны проблемы с Интернет у провайдера или в магистральном канале.
Трассировка может не проходить при ограничениях на фаерволах.
Интерфейс
Поверьте ваши интерфейсы утилитой ifconfig. Утилита ethtool (доступно только для физических серверов) покажет важные параметры. Обратите внимание на параметры «Speed» и «Duplex».
ethtool eth0 Settings for eth0: Supported ports: [ MII ] Supported link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full 1000baseT/Full Supports auto-negotiation: Yes Advertised link modes: 10baseT/Half 10baseT/Full 100baseT/Half 100baseT/Full Advertised auto-negotiation: Yes Speed: 100Mb/s Duplex: Full Port: MII PHYAD: 1 Transceiver: external Auto-negotiation: on Supports Wake-on: g Wake-on: d Link detected: yes
Трафик
Оцените трафик на ваших интерфейсах утилитой iftop:
iftop -Pn -i venet0
iftop показывает список самых активных клиентов, но можно измерить и активность отдельного адреса используя фильтры:
iftop -F 212.34.45.56/32 -i venet0
Службы, порты и соединения
Какие службы работают на вашем сервере, какие порты они слушают и на каких адресах?
ss -ln
и еще так:
netstat -lnutp
Атаки
Может быть кто атакует ваш сервер? Сколько соединений создано к вашему серверу?
netstat -ntu | wc -l
Посмотрим список самых агрессивных клиентов:
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
Другие популярные средства стевого мониторинга
iptraf – сетевая статистика в режиме реального времени Команда iptraf запускает цветной интерактивный монитор, следящий за сетевыми IP. Этот монитор сетевых IP базируется на команде ncurses, которая выдает различную сетевую статистику, в том числе информацию о TCP, ведет подсчет UDP, выдает сведения о ICMP и OSPF, информацию о нагрузке на Ethernet, статистику по узлам сети, данные об ошибках контрольных сумм пакетов IP и многое другое. Монитор предоставляет в удобном для чтения виде следующие данные:
- Статистику сетевого трафика по TCP подключениям
- Статистику IP трафика по сетевым интерфейсам
- Статистику сетевого трафика по протоколам
- Статистику сетевого трафика по портам TCP/UDP и по размерам пакетов
- Статистику сетевого трафика по адресам протоколов второго уровня
tcpdump – детальный анализ сетевого трафика Команда tcpdump – простая команда, выдающая дамп сетевого трафика. Однако, вам нужно хорошо понимать протоколы TCP/IP для того, чтобы использовать это средство. Например, для того, чтобы показать информацию о трафике DNS, введите следующее:
tcpdump -i eth1 'udp port 53'
Для того, чтобы показать все IPv4 HTTP пакеты, идущие на порт и с порта 80, т.е. выдать только те пакеты, которые содержат данные, и, например, не учитывать пакеты SYN и FIN и пакеты ACK-only, введите следующее:
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
Для того, чтобы показать все сессии FTP для адреса 202.54.1.5, введите следующее:
tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'
Для того, чтобы показать все сессии HTTP для адреса 192.168.1.5, введите следующее:
tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'
Введите следующую команду и используйте для просмотра подробностей программу анализа wireshark:
tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80
Прочее
Иногда подвисание сервера может вызвать совершенно неожиданная причина.
- Атака на ваш почтовый сервер может породить очередь сообщений из нескольких сотен тысяч сообщений. Решение - pfqueue для postfix MTA или qmHandle для Qmail MTA.
- Иногда заканчивается место на диске, попытки его освободить ничего не дают, пространство снова исчезает. Это случается когда программа пытается создать файл, но для него не хватает места и файл остается открытым. В такой ситуации занятое файлом место может не учитываться утилитой du и его непросто найти. Остановите все сервисы, снова используйте du. Проверьте активные процессы и их аргументы ps -ax | less , используйте lsof для поиска открытых файлов.