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.
- A ler o load average e saber quando ele é alto de verdade.
- A usar
top,htopepspara achar o processo que pesa. - A entender memória com
freee a ver troca de memória (swap) comvmstat. - A descobrir se o disco é o gargalo com
iostateiotop. - 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:
| Recurso | Sintoma típico | Comando para medir |
|---|---|---|
| CPU (processador) | Ventoinha alta, tudo lento por igual | uptime, top, htop |
| Memória (RAM) | Trocar de janela demora; disco "trabalhando" sem parar | free -h, vmstat |
| Disco (I/O) | Programas demoram a abrir; o mouse anda, mas nada responde | iostat, iotop |
| Rede | Só o que usa internet está lento | ping, 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"
- Carga geral:
uptime. O load average está acima do número de CPUs (nproc)? - Quem está pesando:
topouhtop, ordenando por CPU e depois por memória. - Memória:
free -h. A coluna "disponível" está baixa? O swap está sendo usado? - Troca e espera de disco:
vmstat 1 5. As colunassi/soouwaestão altas? - Disco:
iostat -x 1 3esudo iotop -o. Algum disco perto de 100% de uso? - Espaço e erros:
df -hejournalctl -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ço | Significado |
|---|---|
10:30:00 | Hora atual. |
up 2:31 | A máquina está ligada há 2 horas e 31 minutos. |
1 user | Uma sessão aberta. |
load average: 6,12, 3,40, 1,95 | Mé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.
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
| Linha | O que olhar |
|---|---|
Tarefas | Total 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 mem | Memória em megabytes. Olhe avail mem (disponível) na linha de baixo. |
MB swap | Swap 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
| Tecla | O que faz |
|---|---|
| P | Ordena por CPU (padrão) |
| M | Ordena por memória |
| 1 | Mostra cada CPU separadamente |
| k | Encerra um processo (pede o PID) |
| u | Filtra por usuário |
| q | Sai |
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
| Coluna | Significado |
|---|---|
usada | Ocupada por programas. |
livre | Totalmente sem uso. Costuma ser baixa, e isso é bom. |
buff/cache | Arquivos que o Linux guardou na RAM para abrir mais rápido. É devolvida na hora quando um programa precisa. |
disponível | A coluna que importa: quanto os programas ainda podem usar (livre + cache liberável). |
Swap | Espaç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.
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
| Coluna | Significado | Alerta quando… |
|---|---|---|
r | Processos querendo CPU | Fica acima do número de CPUs |
b | Processos bloqueados esperando disco | Fica sempre acima de 0 |
si / so | Swap entrando / saindo (KB/s) | Qualquer valor contínuo acima de 0: falta RAM |
bi / bo | Blocos lidos / gravados no disco | Muito altos junto com wa alto |
us sy id wa | CPU: programas, kernel, ociosa, esperando disco | id 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:
| Coluna | Significado | Alerta quando… |
|---|---|---|
%util | Quanto do tempo o disco ficou ocupado | Perto de 100% de forma contínua |
r_await / w_await | Tempo médio de cada leitura / escrita, em milissegundos | SSD acima de ~10 ms; HD acima de ~50 ms |
r/s / w/s | Leituras e escritas por segundo | Ajuda 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
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
| Ferramenta | Mostra | Melhor quando… |
|---|---|---|
| Monitor do Sistema (desktop) | Processos, gráficos de CPU, memória e rede | Você está no desktop e quer uma visão rápida. |
top | Processos em tempo real | Qualquer servidor: já vem instalado. |
htop | Processos com cores, árvore e mouse | Investigar com calma. |
ps --sort | Lista estática ordenada | Scripts, relatórios, colar num chamado. |
vmstat 1 | Tendência de CPU, memória e disco | Descobrir qual recurso é o gargalo. |
iostat -x / iotop | Disco por dispositivo / por processo | Suspeita de disco lento ou cheio de trabalho. |
cat /proc/pressure/memory | "Pressão" de CPU, memória e disco | Medir há quanto tempo os processos esperam por um recurso. |
Quando não funciona
$ 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.
$ 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.
$ 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 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
| Comando | O que faz |
|---|---|
uptime | Tempo ligado e load average (1, 5, 15 min) |
nproc | Número de CPUs |
top / top -b -n 1 | Processos em tempo real / uma foto em texto |
htop | Versão interativa e colorida do top |
ps -eo pid,comm,%cpu,%mem --sort=-%cpu | Processos ordenados por CPU |
free -h | Memória e swap |
vmstat 1 5 | Resumo a cada segundo, 5 vezes |
iostat -x 1 3 | Uso detalhado dos discos (pacote sysstat) |
sudo iotop -o | Processos que estão usando o disco agora |
df -h | Espaço livre por sistema de arquivos |
systemd-analyze blame | Tempo de cada serviço no boot |
systemd-analyze critical-chain | O caminho que realmente atrasou o boot |
journalctl -p err -b | Erros 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:
3. Uma linha por segundo
Complete para o vmstat mostrar uma linha a cada 2 segundos, 10 vezes:
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/htopacham o processo; 100% de CPU = um núcleo.- Na memória, olhe "disponível" e o swap, não "livre".
vmstat:ralto = CPU;si/so= falta RAM;bewa= disco. Confirme comiostateiotop.- Boot lento:
systemd-analyze critical-chain.