Thursday, 6 May 2010

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

Часто приходится слышат: "дисковая подсистема - самое узкое место системы", но кто именно убивает винты никто конкретики обычно не дает. Мы как раз будем собирать конкретику прямо с работющей системы :)


Стаивим iotop:
apt-get install iotop -y


Запускаем процесс мониторинга:
nohup iotop --batch --delay 2 --only > /root/iotop_6may.log &


Теперь в файле лога мы увидим нечто вот такое (много-много подобных блоков):

Total DISK READ: 202.58 K/s | Total DISK WRITE: 35.40 K/s
PID USER DISK READ DISK WRITE SWAPIN IO COMMAND
2124 www-data 165.21 K/s 3.93 K/s 0.00 % 8.95 % nginx: worker process
2125 www-data 31.47 K/s 1.97 K/s 0.00 % 0.82 % nginx: worker process
25740 postfix 0 B/s 7.87 K/s 0.00 % 0.09 % tlsmgr -l -t unix -u -c
24583 root 0 B/s 3.93 K/s 0.00 % 0.00 % rsyslogd -c3
6827 www-data 0 B/s 1.97 K/s 0.00 % 0.00 % apache2 -k start


В идеале, оставить сбор лога на сутки, а потом его пропарсить, так данные будут очень точны.

На основе этой информации, можно составить мини-топ пожирателей жесткого диска, который, во-первых, покажет, кто вообще использует диск, во-вторых, каким образом он его использует (чтение / запись), а, в-третьих, позволит указать относительных лидеров по потреблению дисковых ресурсов. Без этих данных оптимизация дисковой системы бессмысленная и невозможна (ну да, SAS/SSD поставить разве что).

Для начала вырезаем заголовки, которые полезной информации нам не несут:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID'


А теперь все это анализируем спец скриптом:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID' | perl -MData::Dumper -e 'my$hs={}; for(<>){ chomp;s/^\s+//g; my@a=split"\\s+",$_; /%\s+([^%]*)$/; $hs->{$1}->{read}+=$a[2];$hs->{$1}->{write}+=$a[4];$hs->{$1}->{swap}+=$a[6]; $hs->{$1}->{io}+=$a[8]; } print "$_\nread: $hs->{$_}->{read} write: $hs->{$_}->{write} swap: $hs->{$_}->{swap} io: $hs->{$_}->{io}\n\n" for reverse sort { my$type="write";$hs->{$a}->{$type} <=> $hs->{$b}->{$type} } keys %$hs;'


Далее, варируя значение $type="write"; выбираем тип сортировки. В самом верху - самый грузящий процесс.

Также немного изменив скрипт, можно научить его делать детализацию не по процесса, а по пользователям:

cat /root/iotop_6may.log | grep -v 'Total' | grep -v 'PID' | perl -MData::Dumper -e 'my$hs={}; for(<>){ chomp;s/^\s+//g; my@a=split"\\s+",$_; /\d+\s+(.*?) /; $hs->{$1}->{read}+=$a[2];$hs->{$1}->{write}+=$a[4];$hs->{$1}->{swap}+=$a[6]; $hs->{$1}->{io}+=$a[8]; } print "$_\nread: $hs->{$_}->{read} write: $hs->{$_}->{write} swap: $hs->{$_}->{swap} io: $hs->{$_}->{io}\n\n" for reverse sort { my$type="write";$hs->{$a}->{$type} <=> $hs->{$b}->{$type} } keys %$hs;'

No comments:

Post a Comment

Note: only a member of this blog may post a comment.