Linux - Как я могу увидеть, что ждет дискового ввода-вывода

42

У меня есть сервер, который имеет очень высокую нагрузку. Ничто не бросается в глаза с точки зрения использования процессора, и это не замена.

Я думаю, это потому, что некоторые процессы ожидают дискового ввода-вывода, и я хочу посмотреть, что ждет.

Есть ли программа, которая покажет мне, какие процессы ожидают ввода-вывода? Я знаю о, iotopно это показывает, что в настоящее время делает IO.

Или это глупый вопрос? (Если так объясните как :))

Рори
источник

Ответы:

47

Вы можете использовать монитор ввода-вывода, такой как iotop, но он покажет вам только процессы или потоки с текущими операциями ввода-вывода.

Если вам нужно просмотреть процессы, ожидающие ввода-вывода, используйте watch для мониторинга процессов с флагом STAT 'D', как показано ниже:

watch -n 1 "(ps aux | awk '\$8 ~ /D/  { print \$0 }')"
Али Мезгани
источник
Милая. Это мне очень помогло.
Стю Томпсон
2
В качестве альтернативы, вы можете использовать команду 'iotop -o', которая будет показывать только 'процессы или потоки, фактически выполняющие ввод / вывод' согласно iotop --help.
Райан
1
@Ryan Кроме того, что он не предоставляет необходимую iowaitинформацию, iotopтребует повышенных привилегий. watch, psи awkдают только необходимую информацию, и не требуют повышенных привилегий.
Богатое
4
Я бы использовал psфлаги POSIX и awkвычеркнул их по-другому: watch "(ps -eo stat,pid,comm|awk '(NR==1)||(\$1~/D/){print}')"- так вы получите заголовки столбцов, а также stat, pid и command.
Богатое
18

ps axuи найдите процессы, которые находятся в состоянии "D". Основываясь на man-странице ps (1) , процессы, находящиеся в состоянии D, находятся в непрерывном режиме сна, что почти всегда означает «ожидание ввода-вывода». К сожалению, уничтожение этих процессов обычно невозможно.

Zanchey
источник
16

Ответ Занчи - лучшее, что я знаю, чтобы узнать, что ждет IO.

Когда вы говорите, что ваш сервер находится под высокой нагрузкой, что вы подразумеваете под этим? Что-то, в частности, медленно реагирует?

Если вас интересует, является ли узким местом ваш дисковый ввод-вывод, я бы использовал команду iostat (часть пакета sysstat), чтобы проверить, действительно ли диск находится под большой нагрузкой.

Пример:

[kbrandt@kbrandt-opadmin: ~] iostat -x 1 3                                                                                           

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.38   34.71    2.64    1.18    0.00   59.21 
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.11    17.35    2.21   20.31    46.57   301.40    15.45     2.27  100.66   1.48   3.34
sda1              0.10    17.31    2.21   20.31    46.48   301.10    15.44     2.27  100.66   1.48   3.34
sda2              0.00     0.00    0.00    0.00     0.00     0.00     3.50     0.00   30.00  30.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00    18.44     0.00  677.67 512.61   0.00

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.22    0.00    4.31    0.00    0.00   89.47   
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sda2              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
sr0               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
Кайл Брандт
источник
1
Было бы полезно объяснить, как интерпретировать выходные данные iostat «чтобы увидеть, действительно ли диск находится под большой нагрузкой».
Скотт Бьюкенен
0

Включите ведение журнала block_dump о том, какие процессы выполняют операции чтения / записи блока:

echo 1 > /proc/sys/vm/block_dump
tail -f /var/log/syslog

когда закончите, отключите трассировку, чтобы не спамить файлы журнала:

echo 0 > /proc/sys/vm/block_dump
Александр Левчук
источник