Nmon: Performance Linux em Tempo Real e em Ficheiro

Quando um servidor começa a responder mal, o primeiro instinto é abrir as ferramentas de monitorização que já estão a correr — e aqui no kbase já cobrimos várias, do Netdata ao Monit. Mas há situações em que nada disto está instalado, ou o problema é pontual e não justifica mais um agente permanente. Para esse momento, o nmon é a ferramenta de diagnóstico: abres a sessão de SSH, premes uma letra e tens o painel que precisas, do CPU aos discos. O mesmo programa grava tudo num ficheiro, para analisares com calma depois do incidente.

O nmon (Nigel’s Monitor) foi escrito por Nigel Griffiths, na altura na IBM, para o AIX e depois portado para Linux. É um binário único que usa a biblioteca ncurses, consome pouquíssimos recursos e mostra tudo no ecrã actualizado de dois em dois segundos. Não tem agentes, não tem base de dados, não tem interface web. É esta simplicidade que o torna ideal para diagnóstico pontual e para gravações de curta duração, por exemplo durante uma janela de manutenção ou um teste de carga.

Neste artigo: instalar o nmon, perceber o ecrã e as teclas, percorrer os painéis de CPU, memória, discos e rede, gravar para ficheiro com o modo -f e analisar o resultado com o nmon Analyser e o nmonchart. No fim, um diagnóstico guiado de 60 segundos.

Neste artigo:

  1. Instalar o nmon
  2. O ecrã inicial e as teclas
  3. CPU e processos
  4. Memória e paginação
  5. Discos e I/O
  6. Rede
  7. Gravar para ficheiro: o modo -f
  8. Analisar o .nmon
  9. Diagnóstico guiado
  10. Erros Comuns
  11. Checklist
  12. Artigos Relacionados
  13. Fontes Oficiais

1. Instalar o nmon

O nmon está nos repositórios oficiais das principais distribuições Linux.

Em Debian e Ubuntu:

sudo apt update
sudo apt install nmon

No Ubuntu, o pacote está no componente universe, activo por omissão na maioria das instalações. Em Debian vem do arquivo principal.

Em RHEL, Rocky Linux e AlmaLinux, o nmon está no repositório EPEL:

sudo dnf install epel-release
sudo dnf install nmon

Para confirmar a versão instalada:

apt policy nmon

As distribuições trazem versões da série 16 (16p no Ubuntu 24.04, 16q no Debian 13). Se precisares de outra arquitectura ou da última versão, o site oficial do nmon disponibiliza binários pré-compilados e o código-fonte. O pacote é minúsculo, na ordem dos 200 kB instalados.

2. O ecrã inicial e as teclas

Lança o nmon sem argumentos:

nmon

O arranque mostra o logotipo, os dados do servidor (distribuição, modelo dos processadores, contagem de núcleos) e a lista de teclas. Os painéis de estatísticas é que não aparecem: cada um acende-se com a sua tecla.

Saída do arranque (captura real, com linhas truncadas):

│ _ __  _ __ ___   ___  _ __    For help type H or ...            │
│| '_ \| '_ ` _ \ / _ \| '_ \    nmon -?  - hint                  │
│| | | | | | | | | (_) | | | |   nmon -h  - full details          │
│|_| |_|_| |_| |_|\___/|_| |_|                                    │
│                               To stop nmon type q to Quit       │
│Fedora release 35 (Thirty Five) VERSION="35 (Thirty Five)"       │
│Vendor=AuthenticAMD Model=AMD EPYC-Milan Processor               │
│MHz=1911.004 bogomips=3822.00     lscpu:CPU=4 Little Endian      │
│Use these keys to toggle statistics on/off:                      │
│  c = CPU         l = CPU Long-term     - = Faster screen updates│
│  m = Memory      V = Virtual memory    j = File Systems         │
│  d = Disks       n = Network           . = only busy disks/procs│
│  r = Resource    N = NFS               h = more options         │
│  k = Kernel      t = Top-processes     q = Quit                 │

A lista de teclas que vais usar no dia a dia:

Tecla Painel
c CPU, um gráfico por núcleo
l histórico de CPU a longo prazo
m memória
V memória virtual e paginação
d discos, gráficos de I/O e % busy
j sistemas de ficheiros
n rede, por placa
k estatísticas do kernel, com a fila de execução
t top processos
r recursos: versão do kernel, CPU, uptime
h mais opções
q sair

Cada tecla acende o painel respectivo e premir de novo apaga-o. Os painéis combinam-se e empilham no mesmo ecrã: c com d com n mostra CPU, discos e rede em conjunto, actualizado de dois em dois segundos. Duas teclas ajudam no ecrã cheio: . mostra apenas os discos e processos ocupados, e + ou - ajustam a velocidade de actualização. Para sair, q.

Terminal Linux com o nmon a mostrar os painéis de CPU (User, Sys, Wait, Idle) e Disk I/O com o disco a 100 por cento ocupado
O nmon em acção: painéis de CPU e Disk I/O combinados no mesmo ecrã, com barras coloridas por User/Sys/Wait e o disco mmcblk0 a 100% Busy.

3. CPU e processos

Com a tecla c, o nmon desenha um gráfico de barras por cada núcleo, com a repartição entre utilizador, sistema, espera de I/O e inactivo. A barra a 100 % significa saturação total do núcleo.

Saída do painel (captura real de um servidor com quatro núcleos):

┌─16k──[H for help]──Hostname=f35ks01─Refresh= 2secs ─18:05:58─┐
│ CPU Utilisation ─────────────────────────────────────────────│
│CPU User%  Sys% Wait%  Idle|0          |25   |50 |75   100|   │
│  1   3.6  17.2   0.0  79.2|Ussssssss>                    |   │
│  2   2.1   6.2   0.0  91.7|Usss    >                     |   │
│Avg   3.0  10.3   0.0  86.7|Usssss>                       |   │
└──────────────────────────────────────────────────────────────┘

O que importa ler: se User% está alto, é trabalho de aplicação. Se Sys% domina, o kernel está a trabalhar demasiado. Se Wait% é alto, o processador passa a vida à espera de I/O — disco é a hipótese mais provável, mas não a única (rede e outros subsistemas também geram esperas). Trata o valor como pista de investigação, não como conclusão, e segue ao painel de discos e aos restantes para confirmar.

A tecla t mostra os processos com mais consumo, uma tabela com PID, utilizador, CPU, memória e nome. Premir t várias vezes alterna o modo de ordenação, do básico ao desempenho médio e ao I/O por processo.

A tecla l acrescenta um histórico de CPU a longo prazo, umas linhas que mostram a evolução das últimas horas no próprio ecrã — útil para confirmar se a carga actual é um pico ou o estado normal do servidor.

A tecla k abre as estatísticas do kernel: fila de execução (run queue), load average, uptime, mudanças de contexto e processos criados. Load alto com CPU tranquilo significa processos à espera de um recurso — tipicamente disco ou memória, e os painéis seguintes decidem qual.

4. Memória e paginação

A tecla m abre o painel Memory and Swap, com o total e o livre de RAM e de swap em MB, as percentagens e a memória interna do kernel.

Saída do painel (etiquetas reais, valores de exemplo):

Memory and Swap ────────────────────────────────────────────
PageSize:4KB
            RAM-Memory  High-Memory  Low-Memory  Swap-Space
Total (MB)     15872.0     15872.0       0.0       2048.0
Free  (MB)      2140.5      2140.5       0.0       1740.0
Free Percent      13.5%       13.5%                  85.0%
Linux Kernel Internal Memory (MB)
             Shared=    312.4     Cached=   8842.1     Active=   2140.8
             Buffers=    168.2 Swapcached=     12.4  Inactive =   5310.6

A leitura normal: a cache do kernel cresce até encher a RAM e isso é bom, não é um problema. O sinal de alarme está na coluna Swap-Space, mas com cautela: swap quase cheio, por si só, não prova pressão de memória actual — sistemas com vm.swappiness alto vivem com swap ocupado sem sofrer. O indicador que conta é a actividade de swap a crescer ao longo do tempo, correlacionada com os restantes indicadores. As colunas High e Low Memory existem por compatibilidade e aparecem como not in use nos kernels de 64 bits.

A tecla V acrescenta o painel Virtual Memory, com os contadores de paginação de /proc/vmstat e as Huge Pages.

Virtual Memory ─────────────────────────────────────────────
nr_dirty    =        12 pgpgin      =    48210
nr_writeback=         0 pgpgout     =    91244
nr_unstable =         0 pgpswpin    =        8
nr_table_pgs=    123456 pgpswpout   =       42
nr_mapped   =    58120 pgfree      =  1204311
nr_slab     =     4912 pgactivate  =    88210
                       pgdeactivate=      421

O que importa: pgpswpin e pgpswpout contam as páginas trocadas com o swap desde o arranque — são contadores acumulados, por isso um valor alto não prova pressão actual. O que interessa é a tendência: observa o painel dois a três minutos e confirma se os valores continuam a crescer de forma sustentada, em combinação com o swap quase cheio e lentidão perceptível. Para identificar o culpado, combina m com t e ordena pela coluna de memória.

5. Discos e I/O

A tecla d desenha o painel Disk I/O, com o nome do disco e o percentual de ocupação (Busy) à esquerda, as velocidades de leitura e escrita (maioritariamente em KB/s) e uma barra a escala cheia à direita. Os números vêm de /proc/diskstats, a mesma fonte do iostat.

Saída do painel (etiquetas reais, valores de exemplo):

DiskName Busy    Read   Write  KB|0          |25         |50          |75       100|
sda        42%  8123.4  234.5  [####................]
sdb         2%     4.2   12.1  [#...................]

Busy é a pista de partida, não um veredicto: acima de 80 % constante merece investigação, mas não confirma um gargalo por si só — em SSD, NVMe, RAID ou armazenamento virtual, discos trabalham bem a percentagens altas. Correlaciona a ocupação com a latência e o tamanho de fila no painel d e, sobretudo, com o desempenho sentido pela aplicação. Discos mecânicos saturam nas operações por segundo muito antes de saturarem em MB/s, pelo que um disco a 100 % com poucos KB/s é típico de acesso aleatório — nesse caso concreto, sim, o disco é o suspeito principal.

Para a perspectiva dos sistemas de ficheiros — pontos de montagem, espaço total, usado e percentagem — a tecla é j. Combina os dois quando o sintoma é lentidão em ficheiros: às vezes o problema não é o I/O do disco, é um volume cheio.

6. Rede

A tecla n mostra o tráfego por placa de rede, com kilobytes recebidos e transmitidos por segundo, pacotes e o tamanho médio dos pacotes.

Saída do painel (captura real, com a coluna Peak truncada):

│ Network I/O ─────────────────────────────────────────────────│
│I/F Name Recv=KB/s Trans=KB/s p_in p_out in_sz out_sz Peak->..│
│      lo      0.0       0.0       0.0    0.0     0.0    0.0...│
│  enp1s0      0.0       0.0       0.5    0.0    52.0    0.0...│
│  enp7s0    218.6    5923.4    3335.5 9989.68   67.1  607.2...│
│ Network Error Counters ──────────────────────────────────────│
│I/F Name iErrors iDrop iOverrun iFrame oErrors   oDrop oOver..│
│  enp7s0       0   34419       0       0       0       0   ...│

Para além do volume, repara nas colunas p_in e p_out (pacotes por segundo) e no painel de erros: contadores de iDrop ou oDrop a crescer indicam que a placa está a descartar pacotes, um problema que o volume médio esconde. Num diagnóstico de lentidão, uma placa com Recv ou Trans encostada ao tecto da rede (cerca de 118 MB/s numa gigabit) é gargalo confirmado — e erros a subir com tráfego baixo apontam para cablagem, switch ou negociação de velocidade.

7. Gravar para ficheiro: o modo -f

O segundo modo do nmon não mostra nada no ecrã. Com a opção -f, recolhe amostras e escreve-as num ficheiro CSV, com o nome no formato hostname_AAAAMMDD_HHMM.nmon no directório corrente. Detalhe prático da manpage: o -f tem de ser o primeiro parâmetro do comando.

nmon -f -s 10 -c 360

Esta linha grava uma amostra a cada 10 segundos (-s 10) durante 360 amostras (-c 360), ou seja, uma hora. As opções estão documentadas na página de manual do Debian:

Opção Função
-f modo gravação para ficheiro (spreadsheet output)
-s segundos entre amostras (por omissão 300)
-c número de amostras (por omissão 288, ou seja 24 horas)
-t incluir os top processos no ficheiro
-d aumentar o número de discos registados (por omissão 256)
-x perfil de capacity planning: equivalente a -f -t -s 900 -c 96, uma amostra de 15 minutos durante um dia

Sem -s e -c, o nmon grava por omissão durante 24 horas, a cada 5 minutos. Para um diagnóstico de curta duração, intervalos curtos:

nmon -f -t -s 5 -c 24

Isto grava dois minutos com os top processos incluídos. Durante a gravação, o processo corre em fundo e termina sozinho no fim do número de amostras, fechando o ficheiro. Para o parar antes da hora, os sinais SIGUSR1 e SIGUSR2 terminam a recolha de forma limpa, com o ficheiro válido até à última amostra — comportamento confirmado no código-fonte (o handler trata SIGUSR1/2 como fim da recolha nas versões 15 e 16), embora a manpage do Debian não documente estes sinais; o kill normal do processo também fecha o ficheiro correctamente. Também é possível fixar opções permanentes na variável de ambiente NMON, por exemplo export NMON=-t para incluir sempre os top processos.

8. Analisar o .nmon

O ficheiro .nmon é texto CSV, mas lê-lo à mão não faz sentido. Existem duas ferramentas oficiais, ambas disponíveis no site oficial do nmon:

nmon Analyser — uma folha de cálculo Excel com macros que carrega o ficheiro .nmon e produz automaticamente dezenas de gráficos, uma folha por cada tipo de dados: CPU, memória, discos, rede, top processos. É a via clássica para relatórios de desempenho, mas exige Microsoft Excel em Windows.

nmonchart — um script para Linux que transforma o .nmon numa página HTML com gráficos interactivos (Google Charts), sem Excel e sem software proprietário. Precisa apenas de ksh e gawk:

ksh nmonchart ficheiro.nmon

O resultado abre em qualquer navegador, dentro ou fora do servidor. Para ambientes PME sem Windows por perto, o nmonchart é o caminho mais rápido do .nmon a um gráfico que se pode mostrar a um colega ou guardar como evidência do incidente.

9. Diagnóstico guiado

Cenário: um servidor de ficheiros está lento às 15 horas e ninguém mexeu em nada. Abre-se a sessão de SSH e lança-se o nmon.

  1. nmon e depois c. CPU a 40 % com Wait% alto? O processador não é o gargalo, e o wait alto é uma pista de esperas de I/O a investigar — disco é a hipótese mais comum, não uma conclusão. CPU a 98 %? Passa ao passo 2 para encontrar o processo.
  2. t. A tabela de processos mostra o culpado do CPU. Se nada consome CPU, segue para o passo 3.
  3. m e depois V. Swap quase cheio e paginação a crescer durante a observação? Activa a hipótese de falta de memória — confirma com a tendência antes de fechar o diagnóstico. Identifica o processo com t ordenado por memória.
  4. d. Um disco com Busy a 95 % e wait elevado? Forte suspeita de gargalo de I/O — confirma com latência e fila antes de fechar. Descobre quem escreve com t em modo I/O.
  5. n. Valores de Recv ou Trans no tecto da rede? O tráfego é o problema, não o servidor.
  6. Deixa evidência para depois: nmon -f -t -s 5 -c 12 grava um minuto completo com processos, para analisar em casa com o nmonchart.

Num minuto percorres os quatro recursos que explicam quase todas as queixas de lentidão em Linux: CPU, memória, disco e rede. Se os cinco painéis estão tranquilos e o servidor continua lento, o problema está mais longe: serviço sobrecarregado, base de dados externa ou ligação de rede do cliente — e os painéis tranquilos afastam as hipóteses de saturação de CPU, memória, disco e rede durante a observação — não provam que o servidor é inocente: uma aplicação ou serviço no próprio servidor pode estar lento sem saturar qualquer recurso. Nesse cenário, os painéis deram o primeiro passo: descartaram os quatro suspeitos clássicos.

Erros Comuns

Sintoma Causa provável Correcção
nmon: command not found Pacote não instalado ou EPEL em falta Instalar epel-release em RHEL/Rocky/Alma e voltar a instalar o nmon
Ecrã com o cabeçalho mas sem dados Nenhuma tecla premida, os painéis não aparecem sozinhos Premir h para ver a lista e acender os painéis desejados
Ficheiro .nmon termina ao fim de poucos minutos Contagem -c pequena ou nmon lançado com intervalos curtos sem contar as amostras Recalcular: amostras = duração ÷ intervalo, por exemplo nmon -f -s 10 -c 360 para uma hora
Ficheiro .nmon enorme, gigabytes Intervalo de segundos com -s muito pequeno durante muitos dias Gravar com -s de 60 a 300 segundos e limitar -c
Tecla sem efeito no ecrã Tecla inexistente ou em maiúsculas erradas (por exemplo V de memória virtual) Premir h para ver a lista de teclas válidas
nmon Analyser recusa abrir o ficheiro Macros do Excel bloqueadas ou versão antiga do Analyser Permitir macros na folha e descarregar a versão actual no site oficial
Sem gráficos para ver fora do Excel Analisar com o nmonchart em Linux Gerar a página HTML com ksh nmonchart ficheiro.nmon

Checklist

  • nmon instalado do repositório (apt ou dnf com EPEL) e versão 16 confirmada
  • Tecla h consultada e os painéis principais dominados: c, m, V, d, n, t
  • Sequência de diagnóstico decorada: CPU, processos, memória e paginação, discos, rede
  • Gravação de fundo testada: nmon -f -s 10 -c 360 e ficheiro .nmon criado no directório corrente
  • Gravações longas com -t para incluir os top processos e -x para capacity planning de um dia
  • nmonchart ou nmon Analyser disponível para converter o .nmon em gráficos
  • Paragem limpa de uma gravação testada com o sinal SIGUSR1 ou SIGUSR2 (ou com o kill normal do processo)

Artigos Relacionados

Fontes Oficiais

  1. nmon and njmon — site oficial do nmon (SourceForge): https://nmon.sourceforge.io/
  2. Página de manual do nmon (Debian): https://manpages.debian.org/trixie/nmon/nmon.1.en.html
  3. nmon Analyser — página oficial: https://nmon.sourceforge.net/pmwiki.php?n=Site.Nmon-Analyser
  4. nmonchart — página oficial: https://nmon.sourceforge.net/pmwiki.php?n=Site.Nmonchart
  5. Pacote nmon no Ubuntu (packages.ubuntu.com): https://packages.ubuntu.com/noble/nmon
  6. Original nmon web page — IBM: https://www.ibm.com/support/pages/original-nmon-web-page