Назад | Перейти на главную страницу

Как проверить использование дискового ввода-вывода для каждого процесса?

У меня проблема с системой Linux, и я обнаружил sysstat и sar чтобы сообщить об огромных пиках дискового ввода-вывода, среднем времени обслуживания, а также среднем времени ожидания.

Как я могу определить, какой процесс вызывает эти пики в следующий раз?

Можно ли делать с sar? Могу ли я найти эту информацию из уже записанных sar файлы?

Выход sar -d, остановка системы произошла около 12.58-13.01.

12:40:01          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
12:40:01       dev8-0     11.57      0.11    710.08     61.36      0.01      0.97      0.37      0.43
12:45:01       dev8-0     13.36      0.00    972.93     72.82      0.01      1.00      0.32      0.43
12:50:01       dev8-0     13.55      0.03    616.56     45.49      0.01      0.70      0.35      0.47
12:55:01       dev8-0     13.99      0.08    917.00     65.55      0.01      0.86      0.37      0.52
13:01:02       dev8-0      6.28      0.00    400.53     63.81      0.89    141.87    141.12     88.59
13:05:01       dev8-0     22.75      0.03    932.13     40.97      0.01      0.65      0.27      0.62
13:10:01       dev8-0     13.11      0.00    634.55     48.42      0.01      0.71      0.38      0.50

У меня также есть следующий вопрос к другой теме, которую я начал вчера:

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

Ты можешь использовать pidstat для печати совокупной статистики io для каждого процесса каждые 20 секунд с помощью этой команды:

# pidstat -dl 20

В каждой строке будут следующие столбцы:

  • PID - идентификатор процесса
  • kB_rd / s - количество килобайт, которое задача вызвала для чтения с диска в секунду.
  • kB_wr / s - количество килобайт, которое задача вызвала или должна вызвать запись на диск в секунду.
  • kB_ccwr / s - количество килобайт, запись которых на диск была отменена задачей. Это может произойти, когда задача усекает грязный кэш страниц. В этом случае некоторые операции ввода-вывода, для которых была учтена другая задача, не будут выполняться.
  • Команда - имя команды задачи.

Результат выглядит так:

05:57:12 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:32 PM       202      0.00      2.40      0.00  jbd2/sda1-8
05:57:32 PM      3000      0.00      0.20      0.00  kdeinit4: plasma-desktop [kdeinit]              

05:57:32 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:57:52 PM       202      0.00      0.80      0.00  jbd2/sda1-8
05:57:52 PM       411      0.00      1.20      0.00  jbd2/sda3-8
05:57:52 PM      2791      0.00     37.80      1.00  kdeinit4: kdeinit4 Running...                   
05:57:52 PM      5156      0.00      0.80      0.00  /usr/lib64/chromium/chromium --password-store=kwallet --enable-threaded-compositing 
05:57:52 PM      8651     98.20      0.00      0.00  bash 

05:57:52 PM       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
05:58:12 PM       202      0.00      0.20      0.00  jbd2/sda1-8
05:58:12 PM      3000      0.00      0.80      0.00  kdeinit4: plasma-desktop [kdeinit]              

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

Есть пара вещей, которые вы мощь иметь возможность проверить, чтобы выявить или устранить, однако - /proc твой друг.

sort -n -k 10 /proc/diskstats
sort -n -k 11 /proc/diskstats

Поля 10, 11 - это накопленные записанные секторы и суммарное время записи (мс). Это покажет ваши горячие разделы файловой системы.

cut -d" " -f 1,2,42 /proc/*/stat | sort -n -k +3

Эти поля представляют собой PID, команду и совокупные тики ожидания ввода-вывода. Это покажет ваши горячие процессы, но только если они все еще работают. (Вероятно, вы захотите игнорировать потоки журналирования файловой системы.)

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

Предостережения: не относится к ядрам до версии 2.6, проверьте документацию, если не уверены.

(А теперь идите и сделайте себе одолжение, установите Munin / Nagios / Cacti / что угодно ;-)

Использовать atop. (http://www.atoptool.nl/)

Запишите данные в сжатый файл, который atop можете читать позже в интерактивном стиле. Снимайте показания (дельта) каждые 10 секунд. сделайте это 1080 раз (3 часа; чтобы, если вы забудете об этом, выходной файл не выйдет за пределы диска):

$ atop -a -w historical_everything.atop 10 1080 &

После того, как снова случится плохое:

(даже если он все еще работает в фоновом режиме, он просто добавляется каждые 10 секунд)

% atop -r historical_everything.atop

Поскольку вы сказали IO, я бы нажал 3 клавиши: tdD

t - move forward to the next data gathering (10 seconds)
d - show the disk io oriented information per process
D - sort the processes based on disk activity
T - go backwards 1 data point (10 seconds probably)
h - bring up help
b - jump to a time (nearest prior datapoint) - e.g. b12:00 - only jumps forward
1 - display per second instead of delta since last datapiont in the upper half of the display

Использовать btrace. Его легко использовать, например btrace /dev/sda. Если команда недоступна, вероятно, она доступна в пакете blktrace.

РЕДАКТИРОВАТЬ: Поскольку debugfs не включен в ядре, вы можете попробовать date >>/tmp/wtf && ps -eo "cmd,pid,min_flt,maj_flt" >>/tmp/wtf или похожие. Регистрация ошибок страниц, конечно, совсем не то же самое, что использование btrace, но, если вам повезет, это МОЖЕТ дать вам подсказку о процессах, наиболее требовательных к диску. Я только что попробовал этот один из моих серверов с наиболее интенсивным вводом-выводом, и в список включены процессы, которые, как я знаю, потребляют много операций ввода-вывода.