💾 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 notop— sistema a aguardar resposta do disco- Load average alto mas CPU
%use%sybaixos — 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
iostatmostraawaitacima de 20 ms ouaqu-szacima 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 5—awaitacima de 20 ms?aqu-szacima de 1? - ✅
iostat—%utilacima 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?
