2.3. Diskdevstat и netdevstat
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 для записи и закрывающие его. При изменении метаданных, а точнее времени изменения, осуществлялась ненужная запись на жесткий диск. Для решения этой проблемы был наложен запрет на подобные вызовы в случае отсутствия обновлений значков.