Ubuntu Desempenho e Monitoramento

"O computador está lento" não é um diagnóstico. Lento por quê? Falta processador, falta memória, o disco está engasgado ou um programa enlouqueceu? Nesta aula você aprende a medir cada recurso e a apontar o culpado em poucos minutos.

Você vai aprender
  • A ler o load average e saber quando ele é alto de verdade.
  • A usar top, htop e ps para achar o processo que pesa.
  • A entender memória com free e a ver troca de memória (swap) com vmstat.
  • A descobrir se o disco é o gargalo com iostat e iotop.
  • A investigar um boot lento com systemd-analyze.

Antes do comando: os quatro recursos

Todo programa disputa quatro recursos. A lentidão quase sempre é um deles no limite, o chamado gargalo:

RecursoSintoma típicoComando para medir
CPU (processador)Ventoinha alta, tudo lento por igualuptime, top, htop
Memória (RAM)Trocar de janela demora; disco "trabalhando" sem pararfree -h, vmstat
Disco (I/O)Programas demoram a abrir; o mouse anda, mas nada respondeiostat, iotop
RedeSó o que usa internet está lentoping, ss (veja ip, ping, ss)

Os exemplos usam a máquina fictícia notebook, com 8 CPUs e 16 GB de RAM.


Roteiro rápido: "está lento"

  1. Carga geral: uptime. O load average está acima do número de CPUs (nproc)?
  2. Quem está pesando: top ou htop, ordenando por CPU e depois por memória.
  3. Memória: free -h. A coluna "disponível" está baixa? O swap está sendo usado?
  4. Troca e espera de disco: vmstat 1 5. As colunas si/so ou wa estão altas?
  5. Disco: iostat -x 1 3 e sudo iotop -o. Algum disco perto de 100% de uso?
  6. Espaço e erros: df -h e journalctl -p err -b.

As seções a seguir explicam cada passo.


1. Carga geral: uptime e o load average

$ uptime
 10:30:00 up  2:31,  1 user,  load average: 6,12, 3,40, 1,95
$ nproc
8
PedaçoSignificado
10:30:00Hora atual.
up 2:31A máquina está ligada há 2 horas e 31 minutos.
1 userUma sessão aberta.
load average: 6,12, 3,40, 1,95Média de processos rodando ou esperando, nos últimos 1, 5 e 15 minutos.

Pense numa padaria com 8 caixas (as 8 CPUs). Load 6 quer dizer que, em média, 6 clientes estavam sendo atendidos ou na fila. Com 8 caixas, ainda sobra caixa livre. A regra prática:

  • Load abaixo do número de CPUs: folga.
  • Load igual: no limite.
  • Load acima: há fila, e as coisas ficam lentas.

Os três números juntos contam uma história: 6,12, 3,40, 1,95 mostra uma carga subindo (era 1,95 há 15 minutos e agora é 6,12). Algo começou a pesar há pouco tempo.

Vírgula ou ponto?

Com o sistema em português, o uptime usa vírgula decimal, por isso os números são separados por "vírgula e espaço". O arquivo /proc/loadavg mostra os mesmos valores com ponto: 6.12 3.40 1.95 3/1688 54116.


2. Quem está pesando: top

O top (de table of processes) mostra os processos que mais usam CPU, atualizando a cada 3 segundos. Saia com q.

$ top
top - 10:30:00 up  2:31,  1 user,  load average: 6,12, 3,40, 1,95
Tarefas: 312 total,   2 em exec., 310 dormindo,   0 parado,   0 zumbi
%CPU(s): 74,2 us,  3,1 sy,  0,0 ni, 22,1 id,  0,4 wa,  0,0 hi,  0,2 si,  0,0 st
MB mem :  15374,2 total,   2104,6 free,   9832,7 used,   3984,1 buff/cache
MB swap:   4096,0 total,   4096,0 free,      0,0 used.   5541,5 avail mem

    PID USUARIO   PR  NI    VIRT    RES    SHR S  %CPU  %MEM    TEMPO+ COMANDO
   4821 ana       20   0 3218840 412300  98120 R 598,0   2,6  12:41.08 ffmpeg       « 6 CPUs inteiras
   2210 ana       20   0   54,8g 486336 152004 S  12,3   3,1   4:36.12 chrome
   1534 ana       20   0 5642184 389120 141556 S   3,7   2,5   2:10.44 gnome-shell

Lendo o cabeçalho

LinhaO que olhar
TarefasTotal de processos; em exec. = rodando agora. Muitos zumbi indicam programa com defeito.
%CPU(s)us = programas; sy = kernel; id = ocioso; wa = esperando o disco. wa alto aponta para o disco, não para a CPU.
MB memMemória em megabytes. Olhe avail mem (disponível) na linha de baixo.
MB swapSwap em uso (used) acima de zero indica que faltou RAM em algum momento.

Lendo a lista

%CPU é medido por núcleo: 100% = um núcleo inteiro. Por isso o ffmpeg aparece com 598%: está usando 6 dos 8 núcleos. RES é a memória real que o processo ocupa. S é o estado: R rodando, S dormindo, D esperando disco, Z zumbi.

Teclas úteis dentro do top

TeclaO que faz
POrdena por CPU (padrão)
MOrdena por memória
1Mostra cada CPU separadamente
kEncerra um processo (pede o PID)
uFiltra por usuário
qSai

Versão "foto": top -b -n 1

Em scripts ou para colar num fórum, rode o top uma vez só, sem tela interativa:

top
O programa.
-b
Batch: modo texto, para ler ou salvar.
-n 1
Uma única atualização e sai.
| head -15
Fica só com as 15 primeiras linhas.
$ top -b -n 1 | head -15 > lentidao.txt

Alternativas: htop e ps

O htop é um top colorido, com mouse e barras por CPU. Instale com sudo apt install htop. Teclas: F6 ordena, F4 filtra pelo nome, F5 mostra em árvore, F9 encerra, F10 sai.

Para uma lista simples e ordenada, sem tela cheia, use ps:

ps
Lista processos.
-e
Todos os processos do sistema.
-o pid,comm,%cpu,%mem
Só estas colunas.
--sort=-%mem
Ordena por memória; o - deixa em ordem decrescente.
| head -6
Cabeçalho e os 5 primeiros.
$ ps -eo pid,comm,%cpu,%mem --sort=-%mem | head -6
    PID COMMAND         %CPU %MEM
   2210 chrome          12.3  3.1
   1534 gnome-shell      3.7  2.5
   4821 ffmpeg          99.8  2.6
   2251 chrome           2.0  2.4
   2304 nautilus         0.1  1.5

Repare: no ps, o %CPU do ffmpeg é a média desde que ele começou, por isso não bate com o top, que mede o momento. Para "agora", confie no top.


3. Memória: free -h

$ free -h
               total       usada       livre    compart.  buff/cache  disponível
Mem.:           15Gi       4,7Gi       3,6Gi       118Mi       7,2Gi        10Gi
Swap:          4,0Gi          0B       4,0Gi
ColunaSignificado
usadaOcupada por programas.
livreTotalmente sem uso. Costuma ser baixa, e isso é bom.
buff/cacheArquivos que o Linux guardou na RAM para abrir mais rápido. É devolvida na hora quando um programa precisa.
disponívelA coluna que importa: quanto os programas ainda podem usar (livre + cache liberável).
SwapEspaço no disco usado como "RAM de emergência". É centenas de vezes mais lento que a RAM.

A Ana tem só 3,6 GiB "livres", mas 10 GiB "disponíveis": está tudo bem. Preocupe-se quando o disponível ficar perto de zero e o Swap usada crescer.

RAM ociosa é RAM desperdiçada

O Linux usa toda a memória sobrando como cache. Por isso "a memória está quase cheia" no Monitor do Sistema não é, por si só, um problema.


4. Troca e espera: vmstat

O vmstat (de virtual memory statistics) mostra, a cada intervalo, um resumo de processos, memória, swap, disco e CPU. É ótimo para ver a tendência.

vmstat
O programa.
1
Uma linha a cada 1 segundo.
5
Para depois de 5 linhas.
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd  livre   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 7  0      0 2155120 540388 3536640    0    0  1075   340 3484 2102 74  3 22  1  0  0   « 1ª linha: média desde o boot
 8  0      0 2151904 540388 3536700    0    0     0    16 6120 4410 76  3 21  0  0  0
 7  0      0 2149876 540390 3536712    0    0     0     8 6033 4392 75  3 22  0  0  0
 8  1      0 2148010 540392 3536740    0    0     4   120 6188 4501 74  4 21  1  0  0
 7  0      0 2147220 540392 3536744    0    0     0     0 5992 4377 75  3 22  0  0  0
ColunaSignificadoAlerta quando…
rProcessos querendo CPUFica acima do número de CPUs
bProcessos bloqueados esperando discoFica sempre acima de 0
si / soSwap entrando / saindo (KB/s)Qualquer valor contínuo acima de 0: falta RAM
bi / boBlocos lidos / gravados no discoMuito altos junto com wa alto
us sy id waCPU: programas, kernel, ociosa, esperando discoid perto de 0 (CPU) ou wa acima de ~20 (disco)

No exemplo, r fica entre 7 e 8 (quase as 8 CPUs) e us em 75%: o gargalo é a CPU, e o top já mostrou o culpado, o ffmpeg. A primeira linha é sempre a média desde o boot; ignore-a.


5. Disco: iostat e iotop

O iostat vem no pacote sysstat, que não vem instalado:

$ sudo apt install sysstat
iostat
Estatísticas de entrada e saída (input/output) dos discos.
-x
Extended: colunas detalhadas, inclusive %util.
-d
Só os discos, sem o resumo de CPU.
nvme0n1
Só este disco (descubra o nome com lsblk).
1 3
A cada 1 segundo, 3 vezes.
$ iostat -x -d nvme0n1 1 3
Device            r/s     rkB/s   rrqm/s  %rrqm r_await rareq-sz     w/s     wkB/s   wrqm/s  %wrqm w_await wareq-sz     d/s     dkB/s   drqm/s  %drqm d_await dareq-sz     f/s f_await  aqu-sz  %util
nvme0n1         25,53    995,79    13,61  34,77    0,41    39,00   15,61    365,16    16,91  52,00    1,74    23,39    0,00      0,00     0,00   0,00    0,00     0,00    2,25    0,13    0,03   2,82
…

São muitas colunas, mas três respondem quase tudo:

ColunaSignificadoAlerta quando…
%utilQuanto do tempo o disco ficou ocupadoPerto de 100% de forma contínua
r_await / w_awaitTempo médio de cada leitura / escrita, em milissegundosSSD acima de ~10 ms; HD acima de ~50 ms
r/s / w/sLeituras e escritas por segundoAjuda a ver quem domina: ler ou gravar

Para saber qual processo está usando o disco, use o iotop (sudo apt install iotop):

sudo iotop
Precisa de root para ver todos os processos.
-o
Only: só os processos que estão lendo ou gravando agora.
$ sudo iotop -o
Total DISK READ:         0.00 B/s | Total DISK WRITE:        84.31 M/s
Current DISK READ:       0.00 B/s | Current DISK WRITE:      91.02 M/s
    TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
   6120 be/4 ana         0.00 B/s   83.95 M/s  0.00 % 72.14 % rsync -a Vídeos /media/ana/HD   « o backup
    412 be/3 root        0.00 B/s    0.36 M/s  0.00 %  1.20 % [jbd2/nvme0n1p2-8]

A saída do iotop é ilustrativa: os números mudam a cada segundo. A coluna IO> mostra quanto do tempo o processo passou esperando o disco.


6. Espaço e erros

Disco cheio deixa tudo estranho: programas não salvam, o login falha, atualizações quebram. Confira sempre:

$ df -h /
Sist. Arq.      Tam. Usado Disp. Uso% Montado em
/dev/nvme0n1p2  468G  121G  324G  28% /

Acima de 90%, investigue com du (veja lsblk, df, du). Depois, procure erros do boot atual no log:

$ journalctl -p err -b --no-pager | tail -5

Quando a memória acaba de vez, o Ubuntu encerra um programa para salvar o sistema. Quem faz isso primeiro é o systemd-oomd; em último caso, o próprio kernel (OOM killer, de out of memory). Os dois deixam rastro no log:

$ journalctl -b | grep -iE "oom|out of memory"

Boot lento: systemd-analyze

$ systemd-analyze
Startup finished in 4.350s (kernel) + 1min 29.713s (userspace) = 1min 34.063s
graphical.target reached after 1min 29.713s in userspace.

O boot tem duas fases: o kernel (4,3 s, normal) e o userspace, os serviços (1 min 29 s, lento). Para ver quem demorou:

$ systemd-analyze blame | head -5
44.011s vboxdrv.service                       « driver do VirtualBox
43.863s e2scrub_reap.service
43.079s plymouth-quit-wait.service            « a tela de boot esperando os outros
22.754s snapd.seeded.service
21.001s snapd.service
"blame" engana

Muitos serviços sobem ao mesmo tempo. Um serviço lento no blame pode não ter atrasado nada. Quem mostra o caminho que realmente segurou o boot é o critical-chain:

$ systemd-analyze critical-chain
graphical.target @1min 29.713s
└─power-profiles-daemon.service @1min 29.548s +164ms
  └─multi-user.target @1min 29.543s
    └─plymouth-quit-wait.service @46.461s +43.079s
      └─systemd-user-sessions.service @45.947s +509ms
        └─network.target @45.918s
          └─NetworkManager.service @39.772s +6.144s

@ é o momento em que o serviço ficou pronto; + é quanto ele demorou. Leia de baixo para cima. A explicação completa de boot está em Boot, GRUB e Kernel.


Formas diferentes de fazer

FerramentaMostraMelhor quando…
Monitor do Sistema (desktop)Processos, gráficos de CPU, memória e redeVocê está no desktop e quer uma visão rápida.
topProcessos em tempo realQualquer servidor: já vem instalado.
htopProcessos com cores, árvore e mouseInvestigar com calma.
ps --sortLista estática ordenadaScripts, relatórios, colar num chamado.
vmstat 1Tendência de CPU, memória e discoDescobrir qual recurso é o gargalo.
iostat -x / iotopDisco por dispositivo / por processoSuspeita de disco lento ou cheio de trabalho.
cat /proc/pressure/memory"Pressão" de CPU, memória e discoMedir há quanto tempo os processos esperam por um recurso.

Quando não funciona

Load alto, mas a CPU está quase ociosa
$ uptime
 10:45:12 up  2:46,  1 user,  load average: 9,40, 8,85, 7,10
$ vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd  livre   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 1  8      0 2302112 541200 3511020    0    0   920 84210 2210 3011  4  2 52 42  0  0   « b=8 e wa=42

O que aconteceu: no Linux, o load conta também os processos esperando o disco. Aqui há 8 processos bloqueados (b) e a CPU passa 42% do tempo esperando (wa).

Como resolver: o gargalo é o disco. Use sudo iotop -o para achar quem está gravando tanto (backup, indexação, atualização) e espere ou pause esse processo.

Tudo travando e o disco não para
$ free -h
               total       usada       livre    compart.  buff/cache  disponível
Mem.:           15Gi        15Gi       142Mi        98Mi       310Mi       201Mi
Swap:          4,0Gi       3,9Gi        98Mi

O que aconteceu: a RAM acabou (só 201 MiB disponíveis) e o swap está quase cheio. O sistema passa o tempo trocando memória com o disco.

Como resolver: ache o processo com mais memória (M no top) e feche-o. Se nem o terminal responde, use o console de texto descrito em Quando o Sistema Trava.

"comando não encontrado"
$ iotop
Comando 'iotop' não encontrado, mas poder ser instalado com:
sudo apt install iotop-c  # version 1.31-1, or
sudo apt install iotop    # version 0.6-42-ga14256a-0.3build4

O que aconteceu: a ferramenta não vem instalada. O Ubuntu sugere os pacotes que a contêm (o "poder" é um erro da tradução original). O iotop-c é uma versão mais nova, escrita em C, com o mesmo uso.

Como resolver: instale um dos pacotes sugeridos. O mesmo vale para iostat (pacote sysstat) e htop.

O top mostra mais de 100% de CPU

O que aconteceu: nada de errado. No top, 100% = um núcleo. Um programa usando 4 núcleos aparece com 400%. Pressione Shift+I para dividir pelo número de CPUs (modo "Irix" desligado).


Referência

ComandoO que faz
uptimeTempo ligado e load average (1, 5, 15 min)
nprocNúmero de CPUs
top / top -b -n 1Processos em tempo real / uma foto em texto
htopVersão interativa e colorida do top
ps -eo pid,comm,%cpu,%mem --sort=-%cpuProcessos ordenados por CPU
free -hMemória e swap
vmstat 1 5Resumo a cada segundo, 5 vezes
iostat -x 1 3Uso detalhado dos discos (pacote sysstat)
sudo iotop -oProcessos que estão usando o disco agora
df -hEspaço livre por sistema de arquivos
systemd-analyze blameTempo de cada serviço no boot
systemd-analyze critical-chainO caminho que realmente atrasou o boot
journalctl -p err -bErros do boot atual

Exercícios

1. Quantas CPUs?

O load average está em 3,5. Complete o comando que diz se isso é muito para esta máquina:

2. Os 5 que mais usam memória

Complete para listar os processos em ordem decrescente de memória:

ps -eo pid,comm,%mem --sort= | head -6

3. Uma linha por segundo

Complete para o vmstat mostrar uma linha a cada 2 segundos, 10 vezes:

vmstat

4. O free -h mostra 600 MiB "livre" e 9 GiB "disponível". O que isso significa?

5. O vmstat mostra wa em 45 e id em 40. Qual é o gargalo mais provável?


Resumo

  • Descubra o recurso no limite antes de agir: CPU, memória, disco ou rede.
  • Load average acima de nproc = fila; compare os três números para ver a tendência.
  • top/htop acham o processo; 100% de CPU = um núcleo.
  • Na memória, olhe "disponível" e o swap, não "livre".
  • vmstat: r alto = CPU; si/so = falta RAM; b e wa = disco. Confirme com iostat e iotop.
  • Boot lento: systemd-analyze critical-chain.