Мониторинг процессов в Linux - pidstat

Ранее мы уже рассматривали одну из утилит входящих в sysstat - sar, сегодня мы расмотрим другую, не менее интересную утилиту - pidstat
 
pidstat расшифровывается как PID (Process ID) Statistic, то бишь статистика по запущенным процессам.
 
Этот инструмент может контролировать каждый процесс, который управляется ядром и генерировать отчеты. Он может контролировать либо конкретный PID (идентификатор процесса), либо все запущенные процессы в системе.
 
pidstat является частью Sysstat, который не установлен по-умолчанию. Установка sysstat расписана в статье Мониторинг производительности Linux на примере sar, так что повторяться я не буду.
 
Итак, pidstat это средство котрое собирает различные статистические данные, такие как использование процессом CPU, дискового пространства, статистика по потокам, связанных с выбранным задачам и дочерними процессами.

1. Показать статистику для всех запущенных процессов (или для конкретного процесса)

Используем опцию -p ALL для просмотра статистики по загруженным ресурсам для всех запущенных процессов.
 
По умолчанию будет показано использование процессора (CPU), но в дальнейших примерах мы посмотрим как просмотреть и другие критерии.

$ pidstat -p ALL | wc -l
274
$ pidstat -p ALL | head
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

18:45:52      UID       PID    %usr %system  %guest    %CPU   CPU  Command
18:45:52        0         1    0,00    0,00    0,00    0,00     2  init
18:45:52        0         2    0,00    0,00    0,00    0,00     1  kthreadd
18:45:52        0         3    0,00    0,00    0,00    0,00     0  ksoftirqd/0
18:45:52        0         5    0,00    0,00    0,00    0,00     0  kworker/0:0H
18:45:52        0         7    0,00    0,05    0,00    0,05     0  rcu_sched
18:45:52        0         8    0,00    0,02    0,00    0,02     0  rcuos/0
18:45:52        0         9    0,00    0,03    0,00    0,03     1  rcuos/1

Используйте опцию -p PID, где PID номер процесса, для просмотра конкретного процесса

$pidstat -p 4583
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

18:48:58      UID       PID    %usr %system  %guest    %CPU   CPU  Command
18:48:58        0      4583    0,04    0,03    0,00    0,08     1  openvpn

Если Вы ранее не сталкивались с утилитами из пакета sysstat, то советую Вам вернуться к теме про sar, где идет более полное рассмотрение вывода команд из этого пакета.

2. Вывод информации по имени процесса

Для вывода информации по конкретному процессу по его имени используется ключ
 
В текущем примере мы выведем информацию для всех процессов в которые входит некоторое ключевое слово (например: evolution) 
$ pidstat -C "evolution"
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

18:56:18      UID       PID    %usr %system  %guest    %CPU   CPU  Command
18:56:18     1000      2685    0,04    0,00    0,00    0,05     3  evolution
18:56:18     1000      2792    0,00    0,00    0,00    0,00     0  evolution-sourc
18:56:18     1000      2884    0,00    0,00    0,00    0,00     0  evolution-alarm
18:56:18     1000      2893    0,00    0,00    0,00    0,00     0  evolution-calen
18:56:18     1000      2958    0,00    0,00    0,00    0,00     0  evolution-addre
Примечание: В приведенном выше примере, параметр -С означает "Имя команды", то бишь будут искать процессы в котром присутствует заданное ключевое слово.

3. Повтор вывода через определенный интервал

По умолчанию вывод не повторяется. 
$pidstat -p 2685
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

19:05:50      UID       PID    %usr %system  %guest    %CPU   CPU  Command
19:05:50     1000      2685    0,04    0,00    0,00    0,05     3  evolution
Для повторения вывода мы ставим определнный временный интервал в секундах в качестве последнего параметра. Например, в текущем примере мы повторим вывод через какждую секунду (пока не нажмете Ctrl-C) 
$pidstat -p 2685 1
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

19:08:16      UID       PID    %usr %system  %guest    %CPU   CPU  Command
19:08:17     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:18     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:19     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:20     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:21     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:22     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:23     1000      2685    0,00    0,00    0,00    0,00     0  evolution
19:08:24     1000      2685    0,00    0,00    0,00    0,00     0  evolution
^C
Среднее:  1000      2685    0,00    0,00    0,00    0,00     -  evolution

Если нам необходим вывод через 5 секунд, используем -

# pidstat -p 2685 5
4. Вывод I/O статистики по процессу. 
 
Используем ключ -d для отчета по вводу-ввыоду для процесса. Он покажет нам различные аттрибуты, такиек как PID, скорость чтения и записи на диска в кБ/c.
Текущий пример на покажет использования диска для процесса 2685 через какждую секунду
$pidstat -p 2685 -d 1
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

19:14:28      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
19:14:29     1000      2685      0,00      0,00      0,00       0  evolution
19:14:30     1000      2685      0,00      0,00      0,00       0  evolution
19:14:31     1000      2685      0,00      0,00      0,00       0  evolution
19:14:32     1000      2685      0,00      0,00      0,00       0  evolution
19:14:33     1000      2685      0,00      0,00      0,00       0  evolution
19:14:34     1000      2685      0,00      0,00      0,00       0  evolution
19:14:35     1000      2685      0,00      0,00      0,00       0  evolution
19:14:36     1000      2685      0,00      0,00      0,00       0  evolution
19:14:37     1000      2685     72,00      0,00      0,00       0  evolution
19:14:38     1000      2685   1272,00      8,00      0,00      16  evolution
19:14:39     1000      2685     20,00      8,00      0,00       0  evolution
19:14:40     1000      2685      0,00      0,00      0,00       0  evolution
19:14:41     1000      2685      0,00      0,00      0,00       0  evolution
19:14:42     1000      2685      0,00      0,00      0,00       0  evolution
^C
Среднее:  1000      2685     97,43      1,14      0,00       1  evolution
5. Вывод страничной активности  
 
Используем опцию -r для вывода сбойных страниц и утилизации памяти для конкретного процесса (PID)
pidstat -p 2685 -r 1
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

19:18:24      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
19:18:25     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:26     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:27     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:28     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:29     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:30     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:31     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
19:18:32     1000      2685      0,00      0,00 4495660 183760   3,04  evolution
^C
Среднее:  1000      2685      0,00      0,00 4495660 183760   3,04  evolution

6. Вывод имени  команды и ее аргументов.

По умолчанию pidstst показывает только имя команды, т.е. без полного пути к команде и ее аргументов. Например, в столбце command вы можете видеть только "python" (которое является именем программы)
$ pidstat -C python
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

19:20:40      UID       PID    %usr %system  %guest    %CPU   CPU  Command
19:20:40     1000      2660    0,00    0,00    0,00    0,00     2  python
19:20:40     1000      2670    0,00    0,00    0,00    0,00     3  python
19:20:40     1000      2671    0,00    0,00    0,00    0,00     1  python

Однако когда Вы используется опцию -l, вы можете просмотреть полный путь команды, а также ее аргументы

$ pidstat -C python -l
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

21:55:37      UID       PID    %usr %system  %guest    %CPU   CPU  Command
21:55:37     1000      2660    0,00    0,00    0,00    0,00     3  python /usr/bin/hp-systray -x 
21:55:37     1000      2670    0,00    0,00    0,00    0,00     1  python /usr/bin/hp-systray -x 
21:55:37     1000      2671    0,00    0,00    0,00    0,00     1  python /usr/bin/hp-systray -x 
В случае необходимости вывода через определенный промежуток времени, не забываем указывать последней опцией время в секундах.

7. Вывод результата через определенные интервалы заданное количество раз

Также возможно задавать количество выводов команды pidstat (чтобы не прерывать по Ctrl-C как в предыдущих примерах)
 
Для этого добавляем еще одно число после интервала в секундах, например сделаем вывод 5 раз через каждые 2 секунды, в конце мы также получим среднее значение по каждой колонке
$ pidstat -p 2685 2 5
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

20:12:28      UID       PID    %usr %system  %guest    %CPU   CPU  Command
20:12:30     1000      2685    0,00    0,00    0,00    0,00     0  evolution
20:12:32     1000      2685    0,00    0,00    0,00    0,00     0  evolution
20:12:34     1000      2685    0,00    0,00    0,00    0,00     0  evolution
20:12:36     1000      2685    0,00    0,00    0,00    0,00     0  evolution
20:12:38     1000      2685    0,00    0,00    0,00    0,00     0  evolution
Среднее:  1000      2685    0,00    0,00    0,00    0,00     -  evolution

8. Вывод статистики по конкретному процессу и его дочерним процессам

Используйте опцию -T с ключевым словом CHILD или TASKS для показа дочерних или самих задач, вы также можете использовать ALL.
То бишь возможные варианты для ключа -T: CHILD или TASKS, или ALL
pidstat -T CHILD | head 
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

20:19:02      UID       PID    usr-ms system-ms  guest-ms  Command
20:19:02        0         1     28040      6250         0  init
20:19:02        0         3         0       440         0  ksoftirqd/0
20:19:02        0         7         0     22260         0  rcu_sched
20:19:02        0         8         0     10030         0  rcuos/0
20:19:02        0         9         0     13320         0  rcuos/1
20:19:02        0        10         0      6800         0  rcuos/2
20:19:02        0        11         0      7110         0  rcuos/3

9. Показать информацию по зависимым процессам в формате дерева

Используя опцию -t, вы можете просмотреть вывод в формате дерева
$ pidstat -C "evolution" -t
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

20:22:17      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
20:22:17     1000      2685         -    0,05    0,01    0,00    0,05     2  evolution
20:22:17     1000         -      2685    0,04    0,00    0,00    0,04     2  |__evolution
20:22:17     1000         -      2790    0,00    0,00    0,00    0,00     1  |__evolution
20:22:17     1000      2792         -    0,00    0,00    0,00    0,00     0  evolution-sourc
20:22:17     1000         -      2792    0,00    0,00    0,00    0,00     0  |__evolution-sourc
20:22:17     1000      2884         -    0,00    0,00    0,00    0,00     2  evolution-alarm
20:22:17     1000         -      2884    0,00    0,00    0,00    0,00     2  |__evolution-alarm
20:22:17     1000         -      2887    0,00    0,00    0,00    0,00     0  |__evolution-alarm
20:22:17     1000      2893         -    0,00    0,00    0,00    0,00     3  evolution-calen
20:22:17     1000         -      2893    0,00    0,00    0,00    0,00     3  |__evolution-calen
20:22:17     1000      2958         -    0,00    0,00    0,00    0,00     1  evolution-addre
20:22:17     1000         -      2958    0,00    0,00    0,00    0,00     1  |__evolution-addre

10. Показать всю статистику по процессу в одну строку

Если запросить pidstat больше чем по одному параметру, он покажет одну информацию за другой. 
То бишь если мы зададим - 
$ pidstat -rud
То будет последовательно показана информация по ключу "-r", потом по "-u", а уже следом по "-d
 
Однако если вы хотите увидеть всю информацию в одну строку по определенному процессу, используйте опцию -h
$ pidstat -rud -h | head
Linux 3.16.0-28-generic (alitiusman)    05.01.2015      _x86_64_        (4 CPU)

#      Time   UID       PID    %usr %system  %guest    %CPU   CPU  minflt/s  majflt/s     VSZ    RSS   %MEM   kB_rd/s   kB_wr/s kB_ccwr/s iodelay  Command
 1420478963     0         1    0,00    0,00    0,00    0,00     2      1,37      0,00   29464   3732   0,06     -1,00     -1,00     -1,00     164  init
 1420478963     0         3    0,00    0,00    0,00    0,00     0      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  ksoftirqd/0
 1420478963     0         7    0,00    0,06    0,00    0,06     1      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  rcu_sched
 1420478963     0         8    0,00    0,03    0,00    0,03     3      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  rcuos/0
 1420478963     0         9    0,00    0,03    0,00    0,03     2      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  rcuos/1
 1420478963     0        10    0,00    0,02    0,00    0,02     3      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  rcuos/2
 1420478963     0        11    0,00    0,02    0,00    0,02     1      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00       0  rcuos/3
Мы довольно подробно рассмотрели возможности утилиты pidstat, использовать ее или взять другой инструмент, решать Вам, но на мой взгляд при решении инцидентов и проблем, данный инструмент будет не лишним. 

 

0
Голосов пока нет