Pull to refresh

Анализ нагрузки диска на Linux

Вступление



Часто ко мне обращаются клиенты с вопросом, почему сайт плохо работает, вроде и память и процессор свободные и код сайта не плохой, и база быстрая. Особенно часто владельцы VPS VDS и прочих виртуалок какие только есть в терминах хостингов.

Дело в том что качественное разграничение мощностей дисков так и не было придумано ни одной технологией виртуализации и получается так что на сервере пять пользователей например, один использует приложение которое постоянно что то пишет или считывает на диск, с диска, тем самым затрудняя доступ всем остальным. Как правило обнаружить и и тем более доказать это сложновато. Точно так же происходит и на выделенном сервере с распределяемыми приложениями.

Выявление



Почему то в интернете не очень часто встретишь описания утилит которые выявляют нагрузки на диски и на данный момент я не нашел такой хорошей одной утилиты которая бы определила сколько, какое приложение и на сколько загружает диск.

Первая хорошая утилита, которая позволяет выявить процент использования диска — atop она требует патча для ядра, там на сайте можно это все прочитать я не хотел бы описывать технику пропатчивания ядра т.к. это довольно избитая тема, тем более что последние ядра в большинстве новых операционных систем включают уже в себя этот патч или модуль ядра.

Вывод программы похож на обычный top только значительно расширенный

PRC | sys 0.27s | user 0.26s | #proc 122 | #zombie 0 | #exit 0 |
CPU | sys 5% | user 13% | irq 54% | idle 226% | wait 102% |
cpu | sys 1% | user 4% | irq 18% | idle 51% | cpu000 w 25% |
cpu | sys 1% | user 5% | irq 13% | idle 53% | cpu003 w 28% |
cpu | sys 2% | user 2% | irq 13% | idle 61% | cpu002 w 22% |
cpu | sys 1% | user 2% | irq 11% | idle 59% | cpu001 w 26% |
CPL | avg1 3.58 | avg5 3.27 | avg15 2.94 | csw 6994 | intr 8361 |
MEM | tot 11.8G | free 2.0G | cache 5.4G | buff 1.0G | slab 370.7M |
SWP | tot 11.2G | free 11.2G | | vmcom 3.8G | vmlim 17.1G |
DSK | sdb | busy 85% | read 192 | write 120 | avio 5 ms |
DSK | sda | busy 19% | read 29 | write 1 | avio 12 ms |
DSK | sdc | busy 2% | read 4 | write 5 | avio 3 ms |
NET | transport | tcpi 16994 | tcpo 11766 | udpi 11 | udpo 11 |
NET | network | ipi 17047 | ipo 12207 | ipfrw 0 | deliv 17009 |
NET | eth0 6% | pcki 7745 | pcko 12175 | si 2662 Kbps | so 66 Mbps |
NET | eth1 5% | pcki 6998 | pcko 11156 | si 6769 Kbps | so 57 Mbps |
NET | lo ---- | pcki 2319 | pcko 2319 | si 3797 Kbps | so 3797 Kbps |


нас интересует поле ряд «DSK»

Как видно программа хорошо показывает нагрузку на каждый диск с распределением на чтение, запись. После нажатия на клавиатуре «d» программа выдаст процессоры по приоритетам нагрузки на диск.

Но к сожалению выявить как именно эти программы нагружают диск при помощи atop не возможно по ряду потому что процессы показываются от общего %-го соотношения на все диски, и не показываются сами используемые файлы.

Далее что хотелось бы сразу отбросить это медленные диски, для выявления скорости доступа к дискам можно пользоваться готовой утилитой hdparm или же руками (dd) мерить скорость чтения, записи на диск.

Важный фактор что все замеры надо осуществлять на остановленной системе что бы ни какие другие программы используемые диск не повлияли на производительность.

hdparm -Tt /dev/sda

по показателям, если вы используете SATA, SATA2 диски скорость чтения не должна быть меньше примерно 3 Gb\s, и запись не менее 50 Mb\s.

SAS & SCSI диски не менее 8000Gb\s и 50 соот-но

Бывает так что при хорошем сочетании RAID контроллера, драйверов и операционной системы удается добиться результата с SATA дисками до 13-15Gb\s и 200-300Mb\s.

что касаемо замеров скорости руками, они считаются более точными, т.к. можно использовать свои параметры поблочного доступа к диску, но этот метод не имеет универсального решения и сравнивать параметры нужно как правило на двух одинаковых дисках что бы выявить проблемный.
time dd if=/dev/zero of=/mnt/testfile bs=16k count=4096 - на запись
time dd if=/mnt/testfile of=/dev/zero bs=16k count=4096 - на чтение

я думаю многие знают эти команды… их не стоит описывать и обсуждать тут

Лично я пользуюсь hdparm этого вполне достаточно для решения поставленной задачи.

И так если диски плохие то тут все понятно, а если скорость достойная, нужно выявить что же конкретно грузит диск, из atop нам должно было стать ясно что это какое то приложение, пусть будет это apache, и грузит он sdb к примеру.

Есть такая утилита хорошая, которая может посмотреть какой процес к какому файлу обращается в момент времени — lsof

Анализируем:
lsof -c apache2
lsof /dev/sdb1


как правило выясняется что это либо какие то логи, либо какой то кеш, но есть более интересные моменты когда вроде бы все нормально и не чего не найти.

тогда мы приходим к методу более жесткому, а именно отладке.

Для выявления нагрузки на диск нужно запустить один процесс апача и подключится к его пиду отладчиком.

ps ax | grep apache
20565 ? S<s 0:01 /usr/sbin/apache2 -k start

strace -f -p 20565 -o /file_output


далее уже анализировать файл на предмет досутпа к диску… как правило в нашем примере это будут .htaccess или правила rewrite которые безустанно шарят по диску по всем папкам и подпапкам в поисках htaccess и подобных служебных файлов, если бы это был пример с nginx то это был бы наверняка кеш папка, логи или служебные библиотеки, если бы это был mysql это бы ли бы наверняка бинарные логи или логи и т.п.

Как работают эти все команды я не расжевываю… надеюсь вы не поленитесь почитать man, главная задача этого поста натолкнуть на идею анализа нагрузки на диск, а не разжевать мануалы команд.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.