10 exemplos de uso do pidstat para analisar a performance do Linux – Elias Praciano
Categories
Tutoriais Ubuntu

10 exemplos de uso do pidstat para analisar a performance do Linux

O pidstat é uma ferramenta de monitoramento, que torna possível acompanhar cada processo individualmente no Linux.
Pidstat quer dizer PID (Process ID) Statistics.
A ferramenta fornece várias informações, o que inclui o uso da CPU pelo proceso, o uso do disco e estatísticas de uso das threads associadas as tarefas executadas por cada processo.
pidstat tutorial featured image
Para poder executar este comando, você precisa instalar o pacote de ferramentas sysstat.
Ao final do texto, relacionei alguns links interessantes, caso você queira se aprofundar no assunto.
A caixa de pesquisa do site, no topo, à direita também pode ajudar você a encontrar outros artigos interessantes. Boa leitura!

Como instalar o sysstat

Usuários do Red Hat, Fedora ou outras distro baseadas nestas, podem usar o yum:

yum install sysstat

Quem for usuário do Debian, do Ubuntu, Mint etc. pode usar o apt-get:

sudo apt-get install sysstat

Ou o aptitude (padrão no Debian):

sudo aptitude install sysstat

Feito a instalação, vamos as dicas de uso…

Clique pra ler mais sobre as ferramentas do SYSSTAT
Clique pra ler mais sobre as ferramentas do SYSSTAT

Como ver estatísticas de TODOS os processos em execução

Para obter as estatísticas referentes a todos os processos use a opção -p ALL (note as maiúsculas), tal como você pode observar no exemplo abaixo.

pidstat -p ALL
Linux 3.13.0-39-generic (case-530U3C-530U4C-532U3C) 	25-11-2014 	_x86_64_	(4 CPU)

16:06:47      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:06:47        0         1    0,00    0,00    0,00    0,01     3  init
16:06:47        0         2    0,00    0,00    0,00    0,00     0  kthreadd
16:06:47        0         3    0,00    0,00    0,00    0,00     0  ksoftirqd/0
16:06:47        0         5    0,00    0,00    0,00    0,00     0  kworker/0:0H
16:06:47        0         7    0,00    0,03    0,00    0,03     3  rcu_sched
...
16:06:47        0     29597    0,00    0,00    0,00    0,00     3  kworker/3:1H
16:06:47        0     29599    0,00    0,00    0,00    0,00     3  irq/43-mei_me
16:06:47        0     31144    0,00    0,00    0,00    0,00     2  kworker/u16:1
16:06:47        0     31290    0,00    0,00    0,00    0,00     2  kworker/u17:1
16:06:47        0     31448    0,00    0,00    0,00    0,00     2  kworker/2:0

Acima, você pode observar as informações de uso da CPU para todos os processos em execução.
Se quiser, pode ver os valores referentes a um processo (PID) em particular:

pidstat -p 29597
Linux 3.13.0-39-generic (case-530U3C-530U4C-532U3C) 	25-11-2014 	_x86_64_	(4 CPU)

16:19:48      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:19:48        0     29597    0,00    0,00    0,00    0,00     3  kworker/3:1H

Se você é novato com o pacote sysstat, dê uma olhada no comando sar — que ajuda a entender estatísticas de performance.

O PID (identificador de processos ou process ID) é um número que os kernels dos sistemas operacionais — tais como o Mac OS X, Windows, Linux, UNIX etc. — usam para identificar cada processo.
Cada processo em execução no seu sistema tem um PID exlusivo.
A partir desta ID, é possível manipular um processo através de funções internas de aplicativos ou na linha de comando.

Como listar estatísticas de performance baseado no nome do processo

Para resolver este problema, use a opção do comando -C.

pidstat -C apache
Linux 3.13.0-39-generic (case-530U3C-530U4C-532U3C) 	25-11-2014 	_x86_64_	(4 CPU)

17:10:42      UID       PID    %usr %system  %guest    %CPU   CPU  Command
17:10:42        0      1342    0,00    0,00    0,00    0,00     2  apache2

O exemplo acima exibe as informações pros processos que cujos nomes contenham a palavra Apache. Experimente outras palavras.

Como repetir periodicamente a saída do comando

Para repetir um comando, dentro de um intervalo, acrescente um número correspondente às vezes em segundos.
Vamos reusar o exemplo anterior. Ao acrescentar o valor 1, ele passará a repetir o comando a cada 1 segundo. Veja:

pidstat -C apache 1
17:44:29      UID       PID    %usr %system  %guest    %CPU   CPU  Command

17:44:30      UID       PID    %usr %system  %guest    %CPU   CPU  Command
17:44:31        0      1342    0,00    1,00    0,00    1,00     2  apache2

Experimente outros valores. Use as teclas Ctrl + C para parar o comando.

Como exibir estatísticas de Entrada/Saída de processos

Para exibir o relatório estatístico de Entrada/Saída de um determinado processo, a cada 1 segundo, use a opção -d, da seguinte forma:

pidstat -p 10993 -d 1
Linux 3.13.0-39-generic (case-530U3C-530U4C-532U3C) 	25-11-2014 	_x86_64_(4 CPU)

19:41:19      UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
19:41:20     1000     10993      0,00     96,00      0,00  firefox
19:41:21     1000     10993      0,00      0,00      0,00  firefox
19:41:22     1000     10993      0,00    128,00      0,00  firefox
19:41:23     1000     10993      0,00    256,00      0,00  firefox
19:41:24     1000     10993      0,00    160,00      0,00  firefox
19:41:25     1000     10993      0,00    160,00      0,00  firefox
19:41:26     1000     10993      0,00    160,00      0,00  firefox
19:41:27     1000     10993      0,00    128,00      0,00  firefox
^C
Média:      1000     10993      0,00    136,00      0,00  firefox

Entre os itens exibidos, estão o PID — informado na linha de comando, as taxas de leitura e gravação no disco em Kb/s etc.

Como mostrar atividades de paginação para processos específicos

A paginação é uma das técnicas permitidas pela gestão de memória no sistema.
Com a paginação, o computador armazena e recupera dados do sistema secundário de armazenamento para usar na memória principal.
A paginação permite que dados sejam armazenados “fragmentados” em disco e organizados contiguamente na memória principal, para uso imediato.
É parte importante da implementação da memória virtual.

Aqui, entra em uso a opção -r, conforme o exemplo abaixo, para exibir falhas de paginação e utilização da memória, referentes a uma determinada tarefa (PID). Veja:

pidstat -p 10993 -r 1
Linux 3.13.0-39-generic (case-530U3C-530U4C-532U3C) 	25-11-2014 	_x86_64_(4 CPU)

19:58:46      UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
19:58:47     1000     10993     22,00      0,00 1602560 432344  11,55  firefox
19:58:48     1000     10993     36,00      0,00 1602560 432592  11,56  firefox
19:58:49     1000     10993     27,00      0,00 1594364 432728  11,56  firefox
19:58:50     1000     10993     20,00      0,00 1594364 432992  11,57  firefox
19:58:51     1000     10993     27,00      0,00 1594364 432992  11,57  firefox
^C
Média:      1000     10993     26,40      0,00 1597642 432730  11,56  firefox

Como exibir comandos em execução e seus argumentos

O comportamento padrão do pidstat é mostrar apenas o nome do comando em execução, sem os detalhes do caminho e dos argumentos e opções dados.
Veja 2 exemplos. No primeiro, vou exibir as estatísticas do navegador Chrome. No segundo as estatística estarão mais detalhadas, com o acréscimo da opção -l:

pidstat -C chrome
Linux 3.13.0-40-generic (case-530U3C-530U4C-532U3C) 	26-11-2014 	_x86_64_	(4 CPU)

15:28:30      UID       PID    %usr %system  %guest    %CPU   CPU  Command
15:28:30     1000     10651    0,02    0,01    0,00    0,03     0  chrome
15:28:30     1000     10662    0,00    0,00    0,00    0,00     0  chrome
15:28:30     1000     10672    0,00    0,00    0,00    0,00     0  chrome
15:28:30     1000     10691    0,00    0,00    0,00    0,00     3  chrome
15:28:30     1000     10710    0,00    0,00    0,00    0,00     1  chrome
15:28:30     1000     10717    0,00    0,00    0,00    0,00     2  chrome
15:28:30     1000     10728    0,00    0,00    0,00    0,00     3  chrome
15:28:30     1000     10731    0,00    0,00    0,00    0,00     0  chrome
15:28:30     1000     10951    0,00    0,00    0,00    0,00     2  chrome

Agora, veja o comando com a exibição das opções e argumentos de execução, além do caminho completo para chegar ao Chrome:

 pidstat -C chrome -l

Linux 3.13.0-40-generic (case-530U3C-530U4C-532U3C) 	26-11-2014 	_x86_64_	(4 CPU)

15:28:17      UID       PID    %usr %system  %guest    %CPU   CPU  Command
15:28:17     1000     10651    0,02    0,01    0,00    0,03     2  /opt/google/chrome/chrome --incognito 
15:28:17     1000     10662    0,00    0,00    0,00    0,00     0  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
15:28:17     1000     10672    0,00    0,00    0,00    0,00     3  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
15:28:17     1000     10691    0,00    0,00    0,00    0,00     2  /opt/google/chrome/chrome --type=gpu-process --channel=10651.0.2015679771 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
15:28:17     1000     10710    0,00    0,00    0,00    0,00     1  /opt/google/chrome/chrome --type=renderer --disable-databases --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials
15:28:17     1000     10717    0,00    0,00    0,00    0,00     3  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen
15:28:17     1000     10724    0,00    0,00    0,00    0,00     0  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen
15:28:17     1000     10728    0,00    0,00    0,00    0,00     1  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen
15:28:17     1000     10731    0,00    0,00    0,00    0,00     1  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

Exibir a saída a intervalos regulares por certo número de vezes

Você já sabe como estabelecer um intervalo, em segundos, para o pidstat fazer sua coleta de informações.
É possível, também, estabelecer um número fixo de vezes em que este processo deve ser repetido — assim, você não precisa interromper com Ctrl + C e ainda tem informações adicionais ao final do relatório.
Basta informar outro valor, ao final da linha de comando (após o número que define o tamanho do intervalo em segundos).
No exemplo, abaixo, o pidstat exibirá os resultados a cada intervalo de 2 segundos, 5 vezes:

pidstat -C chrome -l 2 5

Linux 3.13.0-40-generic (ultra-530U3C-530U4C-532U3C) 	26-11-2014 	_x86_64_	(4 CPU)
ATTENTION: default value of option force_s3tc_enable overridden by environment.

16:06:50      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:06:52     1000     11471  172,55   28,43    0,00  200,98     0  /opt/google/chrome/chrome 
16:06:52     1000     11484    1,96    1,96    0,00    3,92     2  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
16:06:52     1000     11493    0,00    0,49    0,00    0,49     0  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
16:06:52     1000     11512    7,84    4,41    0,00   12,25     3  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA

16:06:52      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:06:54     1000     11471  245,00    9,00    0,00  254,00     3  /opt/google/chrome/chrome 
16:06:54     1000     11512    7,00    1,50    0,00    8,50     0  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
16:06:54     1000     11530   18,00    1,00    0,00   19,00     0  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=DomRel-Enable/enabl
16:06:54     1000     11537   48,50    3,50    0,00   52,00     3  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

16:06:54      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:06:56     1000     11471   62,50    9,50    0,00   72,00     1  /opt/google/chrome/chrome 
16:06:56     1000     11512    1,50    1,50    0,00    3,00     1  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
16:06:56     1000     11530   34,50    2,00    0,00   36,50     2  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=DomRel-Enable/enabl
16:06:56     1000     11537   63,00    5,00    0,00   68,00     2  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

16:06:56      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:06:58     1000     11471   15,50    4,00    0,00   19,50     0  /opt/google/chrome/chrome 
16:06:58     1000     11512    4,50    2,50    0,00    7,00     0  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
16:06:58     1000     11530    4,50    0,00    0,00    4,50     2  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=DomRel-Enable/enabl
16:06:58     1000     11537   75,00    5,50    0,00   80,50     2  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

16:06:58      UID       PID    %usr %system  %guest    %CPU   CPU  Command
16:07:00     1000     11471    4,00    2,50    0,00    6,50     3  /opt/google/chrome/chrome 
16:07:00     1000     11512    5,50    1,00    0,00    6,50     3  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
16:07:00     1000     11537   15,00    1,50    0,00   16,50     2  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

Média:       UID       PID    %usr %system  %guest    %CPU   CPU  Command
Média:      1000     11471  100,20   10,76    0,00  110,96     -  /opt/google/chrome/chrome 
Média:      1000     11484    0,40    0,40    0,00    0,80     -  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
Média:      1000     11493    0,00    0,10    0,00    0,10     -  /opt/google/chrome/chrome --type=zygote --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA1B302F1 
Média:      1000     11512    5,28    2,19    0,00    7,47     -  /opt/google/chrome/chrome --type=gpu-process --channel=11471.0.1175412254 --enable-crash-reporter=BFA8A187-CB5C-B8FF-FDD3-F84DA
Média:      1000     11530   11,35    0,60    0,00   11,95     -  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=DomRel-Enable/enabl
Média:      1000     11537   40,14    3,09    0,00   43,23     -  /opt/google/chrome/chrome --type=renderer --enable-deferred-image-decoding --lang=pt-BR --force-fieldtrials=AutoReloadExperimen

Ao final, o pidstat mostra as médias estatísticas.

Como exibir estatísticas de processos específicos e seus descendentes

Use a opção -T para especificar o processo CHILD (descendente, filho) ou as TASKS (tarefas).
No exemplo, as estatísticas serão listadas por tarefas (TASKS) e, se for o caso, com suas descendências (CHILDren).
Opcionalmente, você pode especificar -T ALL.

Clique pra ler mais sobre as ferramentas do SYSSTAT
Clique pra ler mais sobre as ferramentas do SYSSTAT

Como expor estatísticas de processos dependentes no formato de árvore

Com o uso da opção -t, você pode listar as estatísticas em formato de árvore, conforme exemplo abaixo (estatísticas de uso da CPU do Firefox e suas threads):

pidstat -t -C "firefox"

Linux 3.13.0-40-generic (case-530U3C-530U4C-532U3C) 	26-11-2014 	_x86_64_	(4 CPU)

18:24:59      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
18:24:59     1000      2508         -   43,19    2,04    0,00   45,23     1  firefox
18:24:59     1000         -      2508   38,90    1,15    0,00   40,05     1  |__firefox
18:24:59     1000         -      3871    0,00    0,00    0,00    0,00     2  |__firefox

Veja o exemplo com o “mysql”:

pidstat -t -C "mysql"

Note as colunas TGID (thread group leader) e TID (identificação da thread sendo monitorada).

Linux 3.13.0-40-generic (case-530U3C-530U4C-532U3C) 	27-11-2014 	_x86_64_	(4 CPU)

13:12:39      UID      TGID       TID    %usr %system  %guest    %CPU   CPU  Command
13:12:39      117      1244         -    0,04    0,03    0,00    0,08     2  mysqld
13:12:39      117         -      1244    0,00    0,00    0,00    0,00     2  |__mysqld
13:12:39      117         -      1271    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1272    0,00    0,00    0,00    0,01     0  |__mysqld
13:12:39      117         -      1273    0,00    0,00    0,00    0,00     2  |__mysqld
13:12:39      117         -      1274    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1275    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1276    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1277    0,00    0,00    0,00    0,00     3  |__mysqld
13:12:39      117         -      1278    0,00    0,00    0,00    0,00     0  |__mysqld
13:12:39      117         -      1279    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1280    0,00    0,00    0,00    0,00     1  |__mysqld
13:12:39      117         -      1329    0,01    0,00    0,00    0,01     3  |__mysqld
13:12:39      117         -      1330    0,02    0,00    0,00    0,02     0  |__mysqld
13:12:39      117         -      1331    0,00    0,00    0,00    0,00     0  |__mysqld
13:12:39      117         -      1671    0,00    0,00    0,00    0,00     1  |__mysqld

Como exibir as informações do pidstat horizontalmente, em uma única linha

Se você pedir ao pidstat para reportar mais de um dado estatístico, o aplicativo irá relacionar um atrás do outro.
No exemplo, que segue, ele vai separar as informações da seguinte forma: exibir primeiro estatísticas de performance para a opção -r; em seguida, a opção -u e, por fim, a opção -d.

pidstat -rud

Contudo, se você desejar ver todas estas informações em uma única linha para cada processo individual, use a opção -h:

pidstat -rud -h | head
Linux 3.13.0-40-generic (case-530U3C-530U4C-532U3C) 	27-11-2014 	_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  Command
 1417106085     0         1    0,01    0,01    0,00    0,02     0      4,26      0,00   33904   3188   0,09     -1,00     -1,00     -1,00  init
 1417106085     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  ksoftirqd/0
 1417106085     0         7    0,00    0,03    0,00    0,03     2      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00  rcu_sched
 1417106085     0         8    0,00    0,02    0,00    0,02     1      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00  rcuos/0
 1417106085     0         9    0,00    0,01    0,00    0,01     2      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00  rcuos/1
 1417106085     0        10    0,00    0,01    0,00    0,01     3      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00  rcuos/2
 1417106085     0        11    0,00    0,01    0,00    0,01     1      0,00      0,00       0      0   0,00     -1,00     -1,00     -1,00  rcuos/3

Divirta-se! Compartilhe a nerdice e comente!

Referências:

By Elias Praciano

Autor de tecnologia (livre, de preferência), apaixonado por programação e astronomia.
Fã de séries, como "Rick and Morty" e "BoJack Horseman".
Me siga no Twitter e vamos trocar ideias!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.