← Guia Completo: Diagnóstico de Desempenho em VMs Linux

💾 Componente: Disco. Em ambientes virtualizados, o I/O de disco é frequentemente o maior bottleneck. O acesso a storage partilhado (SAN, NAS, Ceph) introduz latências que o iostat revela claramente. Este artigo explica como interpretar cada campo do iostat -x e como identificar o processo responsável pela sobrecarga de I/O.

Quando suspeitar de problema de disco?

  • %wa (iowait) elevado no top — sistema a aguardar resposta do disco
  • Load average alto mas CPU %us e %sy baixos — o tempo está no iowait
  • Operações de leitura/escrita de ficheiros lentas
  • Base de dados com timeouts ou queries lentas sem mudança de carga
  • iostat mostra await acima de 20 ms ou aqu-sz acima de 1

1. iostat — A Ferramenta Principal de Disco

# Requer sysstat: apt install sysstat  /  yum install sysstat

# Estatísticas estendidas, todos os discos, a cada 2s, 10 amostras
iostat -xz 2 10

# Para um disco específico
iostat -xz 2 5 sda

# Com unidades legíveis (MB/s em vez de kB/s)
iostat -xzm 2 5

Campos do iostat -x — Interpretação completa

Campo Significado Limiar de alerta
r/s Operações de leitura por segundo (IOPS read) Comparar com specs do disco
w/s Operações de escrita por segundo (IOPS write) Comparar com specs do disco
rkB/s Throughput de leitura em kB/s Comparar com largura de banda máxima
wkB/s Throughput de escrita em kB/s Comparar com largura de banda máxima
r_await Latência média de leitura (ms) > 10 ms atenção; > 25 ms crítico
w_await Latência média de escrita (ms) > 10 ms atenção; > 25 ms crítico
await Latência média total de I/O (ms) > 20 ms = problema confirmado
aqu-sz Fila média de pedidos pendentes > 1 = bottleneck; > 3 = crítico
%util % do tempo em que o disco está ocupado > 80% = saturado; > 90% = crítico
🔴 Os dois indicadores mais críticos: await (latência) e aqu-sz (fila). Um disco com %util = 100% mas await = 5ms pode estar bem (SSD com muitos IOPS). Um disco com %util = 60% mas await = 50ms está claramente saturado — os pedidos estão a esperar muito na fila.
💡 Em SSDs e NVMe: O %util pode ser enganoso — SSDs processam múltiplos pedidos em paralelo e podem atingir 100% de utilização sem estarem saturados. Para SSDs, focar em await e aqu-sz.

2. iotop — I/O em Tempo Real por Processo

# Requer root. Instalar: apt install iotop  /  yum install iotop

# Modo interativo — apenas processos com I/O ativo
iotop -o

# Modo batch para scripts/logging (5 iterações, 2s de intervalo)
iotop -o -b -n 5 -d 2

# Top 10 processos por I/O, 3 amostras
iotop -b -n 3 | grep -v "^Total\|^Actual\|^0.00" | head -20
💡 Dica: O iotop combinado com o iostat é a dupla perfeita: o iostat confirma que o disco está saturado, o iotop identifica qual processo é o responsável.

3. Espaço em Disco — df e du

# Espaço em todos os filesystems
df -h

# Verificar inodes (disco "cheio" sem espaço visível!)
df -i

# Top 10 directorias maiores em /var
du -sh /var/* 2>/dev/null | sort -rh | head -10

# Encontrar ficheiros maiores que 500 MB
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh
# Ficheiros apagados mas ainda abertos por processos (a ocupar espaço!)
lsof | grep deleted | awk '{print $7, $9}' | sort -rn | head -10
⚠️ Caso frequente: Um disco aparece “cheio” mas du -sh /* não justifica o espaço usado. A causa mais comum são ficheiros apagados mas ainda abertos por processos (logs, dumps). O espaço só é libertado quando o processo fecha o ficheiro ou é reiniciado.
⚠️ Inodes esgotados: df -i pode mostrar 0% de inodes livres mesmo com espaço em disco disponível — nesse caso não é possível criar novos ficheiros. Resolver eliminando muitos ficheiros pequenos (cache, sessões, temp files).

4. fio — Benchmark de Performance de Disco

# Instalar: apt install fio  /  yum install fio

# Leitura sequencial — típico de streaming/backup
fio --name=read-seq --rw=read --bs=1M --size=1G \
    --numjobs=1 --runtime=30 --group_reporting

# Escrita sequencial
fio --name=write-seq --rw=write --bs=1M --size=1G \
    --numjobs=1 --runtime=30 --group_reporting

# I/O aleatório 4K — típico de base de dados
fio --name=rand-rw --rw=randrw --bs=4k --size=512M \
    --numjobs=4 --runtime=30 --group_reporting \
    --filename=/tmp/fio_test
⚠️ Atenção: Executar o fio em produção com cuidado — o teste de escrita cria ficheiros reais no disco e pode impactar outras operações. Usar --filename=/tmp/fio_test para um ficheiro temporário dedicado.

5. smartctl — Saúde do Disco SMART

# Instalar: apt install smartmontools  /  yum install smartmontools

# Estado geral (PASSED / FAILED)
smartctl -H /dev/sda

# Informação SMART completa
smartctl -a /dev/sda

# Listar discos disponíveis
lsblk -o NAME,TYPE,SIZE,ROTA,SCHED,MODEL
💡 Nota para VMs: Em VMs, o smartctl pode não ter acesso direto ao disco físico subjacente — depende do controlador de armazenamento virtual configurado no hypervisor. Pode ser necessário usar smartctl -d sat /dev/sda ou verificar a saúde no nível do hypervisor.

6. Verificar Erros de Filesystem e Kernel

# Erros de disco no kernel ring buffer
dmesg -T | grep -E 'error|fail|I/O|EXT4|XFS|BTRFS|ata|sd[a-z]' -i | tail -20

# Verificar filesystem EXT4 (disco não montado)
fsck -n /dev/sdb1

# Verificar XFS (sem desmontar)
xfs_repair -n /dev/sdb1

# Estatísticas de XFS
xfs_info /dev/sdb1

7. Scheduler de I/O

# Ver scheduler atual
cat /sys/block/sda/queue/scheduler

# Exemplo output: [mq-deadline] kyber bfq none

# Alterar scheduler (efeito imediato, não persiste após reboot)
echo 'mq-deadline' > /sys/block/sda/queue/scheduler   # HDDs
echo 'none' > /sys/block/sda/queue/scheduler           # SSDs NVMe

# Ver profundidade da fila de I/O
cat /sys/block/sda/queue/nr_requests

8. Checklist — Diagnóstico de Disco

  • iostat -xz 2 5await acima de 20 ms? aqu-sz acima de 1?
  • iostat%util acima de 80% de forma sustentada?
  • iotop -o — qual processo gera mais I/O?
  • df -h && df -i — espaço e inodes livres em todos os volumes?
  • lsof | grep deleted — ficheiros apagados a ocupar espaço?
  • dmesg -T | grep -i error — erros de disco no kernel?
  • smartctl -H /dev/sda — estado SMART PASSED?

Este artigo foi útil?

Duarte Spínola

Deixe um Comentário