Aula #23 - Monitoramento de Processos


Manter o controle de processos rodando (e dormindo) é uma tarefa essencial a administradores de sistema. 


O programa ps tem sido uma das principais ferramentas para esta tarefa em sistemas UNIX por décadas.

No entanto, o ps tem uma história longa e complicada de ser utilizado de formas diferentes em uma variedade sistemas operacionais, o que resulta em uma grande variedade de opções que podem ser aplicadas com combinações confusas. Outra ferramenta é o top, que monitora o estado do sistema interativamente.

Vamos nos concentrar no monitoramento de processos. Existem várias ferramentas feitas para auxiliar administradores de sistema Linux nesta tarefa, alguns exemplos são ps, pstree e top, sendo que todas estas ferramentas tem uma longa história em sistemas baseados no UNIX.


Vamos rever novamente a lista de algumas das principais ferramentas para monitoramento de processos:



Ferramentas de monitoramento de processos e carga do sistema


Ferramenta    Propósito

top    Atividade do processo; atualizado dinamicamente
uptime    Exibir há quanto tempo o sistema está rodando e a carga média
ps    Informação detalhada sobre processos
pstree    Uma árvore de processos e suas conexões
mpstat    Distribuição de carga entre várias CPUS 
iostat    Uso da CPU e estatísticas de I/O
sar    Exibe e coleta informações sobre atividade do sistema
numastat    Informações sobre sistemas NUMA (Non-Uniform Memory Architecture)
strace    Informações sobre as chamadas de sistema(system calls) que um processo faz









PS


O ps é o burro de carga para exibir as características e estatísticas associadas com processos, todas extraídas da pasta /proc .


Este utilitário de linha de comando existe em inúmeras versões de sistemas operacionais baseados em UNIX, e que explica diversidade e complexidade das opções que a versão do Linux aceita. As opções que o ps aceita se dividem em três categorias:


  • Opções UNIX devem vir com um hífen (-) antes de cada opção, e permite que sejam agrupadas.
  • Opções BSD não devem vir com o hífen (-) e também podem ser agrupadas.
  • Opções GNU nomes completos de opções, cada nome deve ser precedido por dois hifens (--)


Ter todas estas opções pode tornar a vida realmente confusa. A maioria dos administradores de sistemas tendem a usar uma ou duas combinações para o seu uso diário.


Um uso típico com parâmetros no formato BSD :


$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 176864  5380 ?        Ss   Jun18   0:01 /sbin/init
root         2  0.0  0.0      0     0 ?        S    Jun18   0:00 [kthreadd]
root         3  0.0  0.0      0     0 ?        S    Jun18   0:02 [ksoftirqd/0]
root         5  0.0  0.0      0     0 ?        S<   Jun18   0:00 [kworker/0:0H]
root         7  0.2  0.0      0     0 ?        S    Jun18   0:48 [rcu_sched]
root         8  0.0  0.0      0     0 ?        S    Jun18   0:00 [rcu_bh]
root         9  0.0  0.0      0     0 ?        S    Jun18   0:00 [migration/0]
root        10  0.0  0.0      0     0 ?        S    Jun18   0:00 [watchdog/0]
root        11  0.0  0.0      0     0 ?        S    Jun18   0:00 [watchdog/1]

.....

root       747  0.0  0.0  28356  2880 ?        Ss   Jun18   0:00 /lib/systemd/systemd-logind
message+   758  0.0  0.0  43744  4716 ?        Ss   Jun18   0:11 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activ
root       782  0.0  0.0  19276  2048 ?        Ss   Jun18   0:01 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
root       790  0.0  0.0      0     0 ?        S<   Jun18   0:00 [iprt-VBoxWQueue]
root       791  0.0  0.0      0     0 ?        S    Jun18   0:00 [iprt-VBoxTscThr]
redis      795  0.0  0.0  38208  2988 ?        Ssl  Jun18   0:17 /usr/bin/redis-server 127.0.0.1:0         
root       803  0.0  0.4 814668 35564 ?        Sl   Jun18   0:01 /usr/local/bin/warsaw/core
root       825  0.0  0.0 260732  3460 ?        Ssl  Jun18   0:00 /usr/sbin/rsyslogd -n


onde o parâmetro aux mostra todos os processos. 

Comandos exibidos entre colchetes (como em [ksoftirqd/0]) são kernel threads; se existe uma dessas threads para cada CPU, o nome da thread é seguido por um número inteiro indicando em qual CPU ela está rodando.

Alguns campos com nomes não intuitivos:


  •     VSZ é a memória virtual do processo em KB.
  •     RSS é o tamanho do conjunto residente, ou a quantidade de memória que um processo está usando que não pode ser movida para o swap em KM.
  •     STAT descreve o estado do processo; Acima vemos apenas S para dormindo (sleeping), ou R para rodando(running).As letras adicionais no campo estado(state) podem ser:

    -  > para alta prioridade (ou um processo que não é nice (legal))
    -   N para baixa prioridade (ou um processo que é nice (legal))
    - L por ter páginas de memória com lock
    -  s para session leader
    -  l para multi-thread
    -  + para estar no grupo de processo de primeiro plano



Adicionar a opção f mostra como o processo se conecta com seus ancestrais, no exemplo abaixo, loguei como root e executei o 'glances':


$ ps auxf
....
root      7636  0.0  0.0  56876  3336 ?        S    Jun18   0:00 su -
root      7638  0.0  0.0  24948  6808 ?        S    Jun18   0:00  \_ -su
root      7650  4.0  0.2  73096 20116 ?        S    Jun18   7:07      \_ /usr/bin/python /usr/local/bin/glances
.....



Um exemplo típico com opções no formato UNIX:


$ ps -elf
F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root         1     0  0  80   0 - 44216 -      Jun18 ?        00:00:01 /sbin/init
1 S root         2     0  0  80   0 -     0 -      Jun18 ?        00:00:00 [kthreadd]
1 S root         3     2  0  80   0 -     0 -      Jun18 ?        00:00:02 [ksoftirqd/0]
1 S root         5     2  0  60 -20 -     0 -      Jun18 ?        00:00:00 [kworker/0:0H]
1 S root         7     2  0  80   0 -     0 -      Jun18 ?        00:00:48 [rcu_sched]
.....

4 S root      7636     1  0  80   0 - 14219 -      Jun18 ?        00:00:00 su -
4 S root      7638  7636  0  80   0 -  6237 -      Jun18 ?        00:00:00 -su
4 S root      7650  7638  4  80   0 - 18274 -      Jun18 ?        00:07:10 /usr/bin/python /usr/local/bin/glances
.....

0 S esl1h    17708  4822  0  80   0 -  6204 -      Jun18 pts/3    00:00:00 bash
0 S esl1h    17741     1 12  80   0 - 271045 -     Jun18 ?        00:05:01 /opt/Mozilla/thunderbird/thunderbird
1 Z esl1h    17745 17741  0  80   0 -     0 -      Jun18 ?        00:00:00 [Thunderbird]


Observe que tanto o Parent Process ID (PPID ou id do processo pai) quanto o niceness (NI ou nível de nice) são exibidos. Vários processos mostram PPID=2 neste exemplo (rodado em um RHEL 7 usando systemd) um processo interno, kthreadd, que é projetado para adotar processos filho quando o processo pai morre. Em versões antigas do Kernel você veria PPID=1 para o sbin/init, mas na verdade algo semelhante está acontecendo.


Algumas opções comuns no formato UNIX:


  •     -A ou -e: Seleciona todos os processos.
  •     -N: Nega a seleção (significa faça o contrário).    
  •     -C: Seleciona por linha de comando.    
  •     -G: Seleciona por ID de grupos (também funciona com nomes).    
  •     -U: Seleciona por ID de usuário (também funciona com nomes).


Se você usar a opção -o com uma lista separada por vírgulas de identificadores, é possível configurar com precisão a saída do ps

    pid:  id do processo.
    
    uid:  id do usuário dono do processo.
    
    cmd:  comando com todos os argumentos.
    
    cputime:  tempo de CPU acumulado.
    
    pmem:  percentual de memória utilizada. Quantos % da memória disponível no sistema o processo está usando.



Exemplo:



$ ps -o pid,uid,command

               PID  UID COMMAND

     7989  500 bash

     8228  500 ps -o pid,uid,command



Você pode consultar a man page do ps para uma lista completa de opções.






PSTREE



 pstree apresenta um descrição visual da hierarquia de processos multi-thread:


$ pstree -aAp 17741
thunderbird,17741
  |-(Thunderbird,17745)
  |-{Cache I/O},17816
  |-{Cache2 I/O},17777
  |-{Cert Verify},17781
  |-{Closing Service},17759
  |-{Compositor},17796
  |-{DNS Resolver #7},22396
  |-{DOM Worker},17807
  |-{GMPThread},17866
  |-{Gecko_IOThread},17756
  |-{HTML5 Parser},17840
  |-{Hang Monitor},17776
  |-{IPDL Background},17806
  |-{ImageBridgeChil},17797
  |-{ImageIO},17801
  |-{ImgDecoder #1},17798
  |-{ImgDecoder #2},17799
  |-{ImgDecoder #3},17800
  |-{JS Helper},17761
  |-{JS Helper},17762
  |-{JS Helper},17763
  |-{JS Helper},17764
  |-{JS Helper},17765
  |-{JS Helper},17766
  |-{JS Helper},17767
  |-{JS Helper},17768
  |-{JS Watchdog},17769
  |-{Link Monitor},17758
  |-{Proxy R~olution},17813
  |-{Socket Thread},17760
  |-{SoftwareVsyncTh},17802
  |-{Timer},17778
  |-{URL Classifier},17814
  |-{dconf worker},17812
  |-{gdbus},17795
  |-{gmain},17838
  |-{localStorage DB},17862
  |-{mozStorage #1},17803
  |-{mozStorage #2},17811
  |-{mozStorage #3},17843
  |-{mozStorage #4},17864
  |-{threaded-ml},17870
  |-{thunderbird},17780
  `-{thunderbird},17854



Consulte a man page do pstree para os detalhes sobre as opções suportadas; No comando acima optamos por exibir informações apenas para o processo com o pid=17741 (Mozilla thunderbird).



Observe que as linhas seguintes do pstree são seus processos filhos (total de 44). Outra forma de ver o mesmo é:
$ ls -l /proc/17741/task



 Quando se deseja saber o que está mantendo o sistema ocupado, a ferramenta padrão é o top. Sem argumentos ele mostra:


$ top



Por padrão, o top atualiza a tela a cada 3.0 segundos.

O top é uma ferramenta antiga com uma tonelada de opções, algumas delas podem ser acionadas durante a execução. Por exemplo, pressionar 1, mostra estatísticas separadas para cada CPU, e pressionar i passa a mostrar apenas os processos que estão ativos. Os dois juntos mostram:


top - 12:51:50 up 1 day, 5:31, 6 users, load average: 0.09, 0.14, 0.22
Tasks: 288 total, 1 running, 287 sleeping, 0 stopped, 0 zombie
%Cpu0 : 3.4 us, 1.3 sy, 0.0 ni, 94.6 id, 0.7 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 : 3.7 us, 0.7 sy, 0.0 ni, 95.0 id, 0.7 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 3.6 us, 1.3 sy, 0.0 ni, 95.1 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 2.3 us, 1.0 sy, 0.0 ni, 96.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem: 8170032 total, 6360684 used, 1809348 free, 46888 buffers
KiB Swap: 4193776 total, 4848 used, 4188928 free. 4292304 cached Mem


  PID USER   PR NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND

 2036 coop   20  0 1876580 396628  37704 S   8.0  4.9 113:14.62 gnome-shell
15082 coop   20  0  547140 185968  21444 S   3.0  2.3  13:22.17 skype-bin
 1648 root   20  0  254972  68920  27208 S   2.3  0.8  33:11.09 Xorg
 2301 coop   20  0  642600  32156  18908 S   1.0  0.4   1:16.76 gnome-terminal-

18712 root   20  0       0      0      0 S   0.7  0.0   0:00.25 kworker/1:1
 2111 coop   20  0  995392  29424  21076 S   0.3  0.4   0:03.13 nautilus
15465 coop   20  0 1032892 191332 105244 S   0.3  2.3   0:10.88 chrome
18973 coop   20  0  123768   3108   2492 R   0.3  0.0   0:00.04 top


É possível controlar como os campos são ordenados e exibidos; há várias opções além das opções padrão. Por exemplo pressionar h ou ? mostra uma lista resumida de comandos e q encerra.


É possível matar um processo pressionando k, ou alterar a prioridade (renice) com r.


A man top é extensa em opções de uso e configurações.


Existem alternativas populares ao top padrão, algumas com uma interface mais visual e/ou com mais informações, como o htop, ntop e atop. E a maioria das distribuições Linux tem alternativas gráficas (como o gnome-system-monitor ou ksysguard).

Uma das melhores alternativas ao  top é o Glances.





Mais vistos no mês:

As melhores distribuições Linux para 2017

Teste de Performance de Rede com Iperf

TuxMath - Tux, do Comando da Matemática. Ensino e diversão a crianças.

OPNsense - Firewall Open Source

Aula #14 - Os sistemas de arquivos ext2/ext3/ext4

DHCP - Guia Completo

Modelo Firewall Completo em Iptables para pequena rede/office

SSD no linux

Administração de sistema e Deploys: Ansible, Chef, Fabric, Puppet ou Salt?