2.3. Diskdevstat и netdevstat

Для сбора статистики о дисковой и сетевой активности программ SystemTap использует diskdevstat и netdevstat. Они в чем-то схожи с PowerTOP, которая для каждой программы показывает количество попыток пробуждения процессора в секунду (см. Раздел 2.2, «PowerTOP»). С помощью diskdevstat и netdevstat можно идентифицировать приложения, нерационально потребляющие энергию за счет выполнения большого числа операций ввода/вывода вместо объединения их в группы и одновременного выполнения.
Команда их установки выглядит так:
yum install systemtap tuned-utils kernel-debuginfo
Команда запуска:
diskdevstat
или
netdevstat
Обе команды принимают максимум три аргумента:
diskdevstat интервал_обновлений длительность таблица
netdevstat интервал_обновлений длительность таблица
интервал_обновлений
Время между обновлениями экрана (в секундах). По умолчанию 5 секунд.
длительность
Длительность полного цикла. По умолчанию 86400 (1 день).
таблица
Показывает сводную таблицу полученной статистики.
Вывод команды аналогичен PowerTOP. Например, вывод diskdevstat в Fedora 10 с KDE 4.2 будет выглядеть так:
  PID   UID DEV     WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG    READ_CNT  READ_MIN  READ_MAX  READ_AVG COMMAND        
 2789  2903 sda1          854     0.000   120.000    39.836           0     0.000     0.000     0.000 plasma            
15494     0 sda1            0     0.000     0.000     0.000         758     0.000     0.012     0.000 0logwatch         
15520     0 sda1            0     0.000     0.000     0.000         140     0.000     0.009     0.000 perl              
15549     0 sda1            0     0.000     0.000     0.000         140     0.000     0.009     0.000 perl              
15585     0 sda1            0     0.000     0.000     0.000         108     0.001     0.002     0.000 perl              
 2573     0 sda1           63     0.033  3600.015   515.226           0     0.000     0.000     0.000 auditd            
15429     0 sda1            0     0.000     0.000     0.000          62     0.009     0.009     0.000 crond             
15379     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15473     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15415     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15433     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15425     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15375     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15477     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15469     0 sda1            0     0.000     0.000     0.000          62     0.007     0.007     0.000 crond             
15419     0 sda1            0     0.000     0.000     0.000          62     0.008     0.008     0.000 crond             
15481     0 sda1            0     0.000     0.000     0.000          61     0.000     0.001     0.000 crond             
15355     0 sda1            0     0.000     0.000     0.000          37     0.000     0.014     0.001 laptop_mode       
 2153     0 sda1           26     0.003  3600.029  1290.730           0     0.000     0.000     0.000 rsyslogd          
15575     0 sda1            0     0.000     0.000     0.000          16     0.000     0.000     0.000 cat               
15581     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15582     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15579     0 sda1            0     0.000     0.000     0.000          12     0.000     0.001     0.000 perl              
15580     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15354     0 sda1            0     0.000     0.000     0.000          12     0.000     0.170     0.014 sh                
15584     0 sda1            0     0.000     0.000     0.000          12     0.001     0.002     0.000 perl              
15548     0 sda1            0     0.000     0.000     0.000          12     0.001     0.014     0.001 perl              
15577     0 sda1            0     0.000     0.000     0.000          12     0.001     0.003     0.000 perl              
15519     0 sda1            0     0.000     0.000     0.000          12     0.001     0.005     0.000 perl              
15578     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15583     0 sda1            0     0.000     0.000     0.000          12     0.001     0.001     0.000 perl              
15547     0 sda1            0     0.000     0.000     0.000          11     0.000     0.002     0.000 perl              
15576     0 sda1            0     0.000     0.000     0.000          11     0.001     0.001     0.000 perl              
15518     0 sda1            0     0.000     0.000     0.000          11     0.000     0.001     0.000 perl              
15354     0 sda1            0     0.000     0.000     0.000          10     0.053     0.053     0.005 lm_lid.sh
Столбцы:
PID
Идентификатор процесса.
UID
Идентификатор пользователя, от лица которого выполняются приложения.
DEV
Устройство, где выполнялись операции ввода и вывода.
WRITE_CNT
Общее число операций записи.
WRITE_MIN
Минимальная длительность двух последовательных операций записи (в секундах).
WRITE_MAX
Максимальная длительность двух последовательных операций записи (в секундах).
WRITE_AVG
Средняя длительность двух последовательных операций записи (в секундах).
READ_CNT
Общее число операций чтения.
READ_MIN
Минимальная длительность двух последовательных операций чтения (в секундах).
READ_MAX
Максимальная длительность двух последовательных операций чтения (в секундах).
READ_AVG
Средняя длительность двух последовательных операций чтения (в секундах).
COMMAND
Имя процесса.
В этом примере следует обратить внимание на следующие процессы:
  PID   UID DEV     WRITE_CNT WRITE_MIN WRITE_MAX WRITE_AVG    READ_CNT  READ_MIN  READ_MAX  READ_AVG COMMAND
 2789  2903 sda1          854     0.000   120.000    39.836           0     0.000     0.000     0.000 plasma
 2573     0 sda1           63     0.033  3600.015   515.226           0     0.000     0.000     0.000 auditd
 2153     0 sda1           26     0.003  3600.029  1290.730           0     0.000     0.000     0.000 rsyslogd
Следует обратить внимание на ненулевое значение счетчика WRITE_CNT, что означает, что эти программы выполняли запись в процессе сбора статистики. Наихудший результат демонстрирует plasma — этот процесс выполнял запись больше всего с наименьшей задержкой между операциями. Поэтому в первую очередь надо обратить внимание именно на Plasma и продумать возможности оптимизации.
Более подробный анализ всех вызовов отдельных процессов можно выполнить с помощью strace и ltrace. Так, для нашего примера можно выполнить
strace -p 2789
Вывод strace в этом случае показал повторяющиеся действия каждые 45 секунд, открывающие файл значков KDE для записи и закрывающие его. При изменении метаданных, а точнее времени изменения, осуществлялась ненужная запись на жесткий диск. Для решения этой проблемы был наложен запрет на подобные вызовы в случае отсутствия обновлений значков.