Как я могу записать, какой процесс или активность ядра использует диск в GNU/Linux?

На определенном сервере Debian iostat (и тому подобное) сообщают о неожиданно большом объеме (в байтах) записи на диске. У меня возникли проблемы с разработкой процесса, который выполняет эти операции.

Два интересных момента:

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

  • Несмотря на запись, похоже, что они не потребляют больше места на диске.

Оба из них заставляют меня думать, что запись может быть чем-то, что делает ядро, но я не меняю местами, поэтому мне не ясно, что Linux может попытаться написать.

Можно попробовать:

http://www.atcomputing.nl/Tools/atop/

но хотелось бы избежать исправления моего ядра.

Любые идеи о том, как отслеживать это?

Ответы

Ответ 1

iotop хорош (отлично, на самом деле).

Если у вас есть ядро ​​до 2.6.20, вы не можете использовать большинство этих инструментов.

Вместо этого вы можете попробовать следующее (которое должно работать почти для любого 2.6 ядра IIRC):

    
sudo -s
dmesg -c
/etc/init.d/klogd stop
echo 1 > /proc/sys/vm/block_dump
rm /tmp/disklog
watch "dmesg -c >> /tmp/disklog"
   CTRL-C when you're done collecting data
echo 0 > /proc/sys/vm/block_dump
/etc/init.d/klogd start
exit (quit root shell)

cat /tmp/disklog | awk -F"[() \t]" '/(READ|WRITE|dirtied)/ {activity[$1]++} END {for (x in activity) print x, activity[x]}'| sort -nr -k2

Линии dmesg -c очищают журнал ядра. Затем регистратор отключается вручную (с использованием часов), сбрасываемых на диск (буфер памяти невелик, поэтому нам нужно это сделать). Пусть он работает около пяти минут или около того, а затем CTRL-c - процесс просмотра. После завершения регистрации и перезапуска klogd проанализируйте результаты, используя бит awk в конце.

Ответ 2

Если вы используете ядро, более новое, чем 2.6.20, это очень просто, так как это первая версия ядра Linux, которая включает учет ввода-вывода. Если вы компилируете собственное ядро, обязательно укажите:

CONFIG_TASKSTATS=y
CONFIG_TASK_IO_ACCOUNTING=y

Ядра из пакетов Debian уже включают эти флаги, поэтому нет необходимости перекомпилировать ваше ядро. Стандартная утилита для доступа к данным учета ввода-вывода в реальном времени - iotop (1). Он дает вам полный список процессов, управляемых планировщиком ввода-вывода, и отображает статистику процесса для использования используемой полосы пропускания для чтения, записи и общего использования.

Ответ 3

Возможно, вам захочется исследовать iotop для Linux. Существует несколько версий Solaris, но, например, есть пакет Debian.

Ответ 4

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

Ответ 5

Вы также можете использовать htop, включив столбец IO_RATR. Htop - превосходная верхняя замена.

Ответ 7

Вы можете попытаться использовать SystemTap, у него много примеров, и если я не ошибаюсь, это показывает, как делать такие вещи.

Ответ 8

Я недавно слышал о Mortadelo, клон Filemon, но еще не проверил его:

http://gitorious.org/mortadelo