Benchmark de I/O com FIO
Guia completo de instalação, execução, leitura de resultados e parsing de saída.
PROPÓSITO
Medir o desempenho real de um disco ou pool de armazenamento com cargas controladas e reproduzíveis, em vez de depender de impressão.
Quando usar: Antes de colocar um storage em produção, ao comparar discos ou configurações, e quando uma reclamação de lentidão precisa virar número.
Pré-requisitos: Acesso root, o pacote fio instalado e espaço livre para o arquivo de teste.
1. O que é o FIO
O FIO (Flexible I/O Tester) é a ferramenta padrão de benchmarking de I/O em ambientes Linux. Permite simular padrões reais de acesso a disco com controle preciso sobre block size, profundidade de fila, número de threads, modo de I/O (síncrono/assíncrono) e mix de leitura/escrita.
É utilizado para:
Avaliar a performance bruta de HDDs, SSDs SATA e NVMe
Simular cargas de bancos de dados, filesystems e aplicações
Comparar configurações de storage antes e depois de mudanças
Validar SLAs de performance em ambientes de produção
2. Instalação
# Debian / Ubuntu
apt install fio
# RHEL / CentOS / Rocky
dnf install fio
# Verificar versão instalada
fio --version3. Conceitos Fundamentais
3.1 Parâmetros Essenciais
| Parâmetro | O que controla |
|---|---|
| --rw | Padrão de acesso: leitura, escrita, aleatório, misto |
| --bs | Block size — tamanho de cada operação de I/O |
| --ioengine | Motor de I/O: libaio (assíncrono) ou sync (síncrono) |
| --direct | 1 = bypassa page cache; 0 = usa cache do SO |
| --iodepth | Número de operações em voo simultaneamente (fila) |
| --numjobs | Número de processos/threads paralelos |
| --size | Volume total de dados a ser processado por job |
| --runtime | Duração máxima do teste em segundos |
| --rwmixread | Percentual de leitura no modo misto (padrão: 50) |
3.2 Regra do /tmp
Sempre verifique antes de apontar o arquivo de teste para /tmp:
df -hT /tmpSe a coluna Type mostrar tmpfs, o /tmp está montado em RAM. Nesse caso, o FIO medirá a velocidade da memória, não do disco. Use um caminho explícito em disco:
# Caminho seguro
--filename=/home/$USER/fio_test.tmp
# Ou aponte para o disco que deseja testar
--filename=/data/fio_test.tmp3.3 --direct=1 vs --direct=0
| Modo | Quando usar |
|---|---|
| --direct=1 | Benchmarks de hardware — mede o dispositivo real sem interferência do cache |
| --direct=0 | Simulação de aplicações reais que se beneficiam do page cache do SO |
Para avaliar o disco em si, sempre use --direct=1.
4. Modos de Operação
4.1 Sequencial
Lê ou escreve blocos em ordem no dispositivo. Maximiza throughput (MB/s). Ideal para medir largura de banda bruta.
| --rw | Quando usar |
|---|---|
| read | Avaliar throughput de leitura — cópias de arquivos grandes, streaming, restore de backup |
| write | Avaliar throughput de escrita — ingestão de dados, gravação de logs, backup |
| readwrite | Simular cargas que leem e escrevem ao mesmo tempo — use --rwmixread para ajustar o percentual |
Block size recomendado:--bs=1M
4.2 Aleatório
Acessa posições aleatórias no dispositivo. Maximiza IOPS. Ideal para simular bancos de dados, filesystems e cargas transacionais.
| --rw | Quando usar |
|---|---|
| randread | Simular queries de leitura em banco de dados, cache miss, acesso a índices |
| randwrite | Simular alto volume de inserções, updates, journaling de filesystem |
| randrw | Simular carga OLTP mista — use --rwmixread=70 para o padrão típico de 70% leitura |
Block size recomendado:--bs=4k
5. Cenários de Teste
Substitua
/home/$USER/fio_test.tmppelo caminho desejado em todos os comandos.Todos os exemplos usam pipe direto para
jq— o resultado aparece limpo no terminal ao fim do teste.
Legenda dos campos de saída
| Campo | O que é |
|---|---|
| bw_Mbit | Throughput médio em Mbit/s durante o teste — unidade padrão de NICs, switches e TrueNAS (1 MiB/s = 8,39 Mbit/s) |
| iops | Número de operações de I/O completadas por segundo |
| lat_p50_ms | Latência em ms abaixo da qual estão 50% das operações — representa o caso típico |
| lat_p99_ms | Latência em ms abaixo da qual estão 99% das operações — revela stalls eventuais |
| lat_p999_ms | Latência em ms abaixo da qual estão 99,9% das operações — revela os piores casos isolados |
Dois modos de teste nos cenários aleatórios: o modo throughput (
iodepth=32+,numjobs=4) mede IOPS e banda máxima sob carga — latências serão maiores que a latência real do disco. O modo latência pura (iodepth=1,numjobs=1) mede o tempo de resposta mínimo do dispositivo, compatível com datasheets de fabricantes. As tabelas de referência indicam qual modo usam.Por que p99 importa mais que a média? A média esconde picos. Um disco que responde em 1 ms na média mas tem p99 de 500 ms vai causar timeouts em produção. Sempre avalie p99 e p99,9 antes de concluir que o dispositivo está saudável.
5.1 Leitura Sequencial Pura
Mede o throughput máximo de leitura sequencial. Métrica principal: bw_Mbit.
fio --name=seq_read \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=1M --rw=read \
--ioengine=libaio --direct=1 \
--iodepth=16 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p50_ms: (.read.clat_ns.percentile["50.000000"] / 1000000 | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round),
lat_p999_ms: (.read.clat_ns.percentile["99.900000"] / 1000000 | round)
}'Referência — bw_Mbit esperado (Mbit/s):
| Dispositivo / Configuração | Mínimo | Máximo |
|---|---|---|
| — Local — | ||
| HDD 7200 RPM | 839 Mbit/s | 1.590 Mbit/s |
| SSD SATA III | 3.190 Mbit/s | 4.490 Mbit/s |
| NVMe Gen3 | 15.940 Mbit/s | 28.020 Mbit/s |
| NVMe Gen4 | 40.010 Mbit/s | 55.990 Mbit/s |
| NVMe Gen5 | 80.030 Mbit/s | 111.990 Mbit/s |
| — NFS 1 GbE — | ||
| NFS 1 GbE + HDD backend | 587 Mbit/s | 839 Mbit/s |
| NFS 1 GbE + SSD backend | 671 Mbit/s | 923 Mbit/s |
| — VM + NFS (Proxmox) — | ||
| NFS 1 GbE + NVMe backend | 713 Mbit/s | 940 Mbit/s |
| — NFS 10 GbE — | ||
| VM + NFS + HDD backend | 419 Mbit/s | 1.090 Mbit/s |
| VM + NFS + SSD backend | 671 Mbit/s | 2.350 Mbit/s |
| NFS 10 GbE + HDD backend | 755 Mbit/s | 1.590 Mbit/s |
| NFS 10 GbE + SSD backend | 2.940 Mbit/s | 4.450 Mbit/s |
| VM + NFS + NVMe backend | 839 Mbit/s | 2.940 Mbit/s |
| NFS 10 GbE + NVMe backend | 3.360 Mbit/s | 7.550 Mbit/s |
| — iSCSI 1 GbE — | ||
| iSCSI 1 GbE + HDD backend | 629 Mbit/s | 881 Mbit/s |
| iSCSI 1 GbE + SSD backend | 713 Mbit/s | 940 Mbit/s |
| iSCSI 1 GbE + NVMe backend | 755 Mbit/s | 965 Mbit/s |
| — iSCSI 10 GbE — | ||
| iSCSI 10 GbE + HDD backend | 797 Mbit/s | 1.590 Mbit/s |
| iSCSI 10 GbE + SSD backend | 3.360 Mbit/s | 4.610 Mbit/s |
| iSCSI 10 GbE + NVMe backend | 4.190 Mbit/s | 9.230 Mbit/s |
| — Ceph RBD (iSCSI-like block) — | ||
| Ceph RBD + HDD (3x rep) | 503 Mbit/s | 1.260 Mbit/s |
| Ceph RBD + SSD (3x rep) | 2.100 Mbit/s | 4.190 Mbit/s |
| Ceph RBD + NVMe (3x rep) | 3.360 Mbit/s | 7.550 Mbit/s |
| Ceph RBD + NVMe (EC 4+2) | 4.190 Mbit/s | 10.070 Mbit/s |
| — CephFS (NFS-like filesystem) — | ||
| CephFS + HDD (3x rep) | 419 Mbit/s | 1.090 Mbit/s |
| CephFS + SSD (3x rep) | 1.680 Mbit/s | 3.770 Mbit/s |
| CephFS + NVMe (3x rep) | 2.940 Mbit/s | 6.710 Mbit/s |
| — Hiperconvergência (Proxmox + Ceph) — | ||
| HCI + HDD (3x rep) | 336 Mbit/s | 1.010 Mbit/s |
| HCI + SSD (3x rep) | 1.510 Mbit/s | 3.360 Mbit/s |
| HCI + NVMe (3x rep) | 2.520 Mbit/s | 6.290 Mbit/s |
Em sequencial com bs=1M, o link de rede é o principal limitante — HDD, SSD e NVMe como backend entregam valores próximos em 1 GbE porque o teto do link (~998 Mbit/s) é atingido antes do disco. A diferença aparece em 10 GbE.
Referência — lat_p99_ms esperado (bs=1M, iodepth=16):
| Dispositivo / Configuração | p99 típico |
|---|---|
| — Local — | |
| HDD 7200 RPM | 150–500 ms |
| SSD SATA III | 30–80 ms |
| NVMe Gen3 | 5–20 ms |
| NVMe Gen4/5 | 2–10 ms |
| — NFS (1/10 GbE) — | |
| NFS + HDD backend | 200–600 ms |
| NFS + SSD backend | 60–200 ms |
| NFS + NVMe backend | 30–120 ms |
| — iSCSI (1/10 GbE) — | |
| iSCSI + HDD backend | 150–500 ms |
| iSCSI + SSD backend | 40–150 ms |
| iSCSI + NVMe backend | 20–80 ms |
| — Ceph RBD — | |
| Ceph RBD + HDD (3x rep) | 200–700 ms |
| Ceph RBD + SSD (3x rep) | 40–150 ms |
| Ceph RBD + NVMe (3x rep) | 15–60 ms |
| — CephFS — | |
| CephFS + HDD (3x rep) | 250–800 ms |
| CephFS + SSD (3x rep) | 60–200 ms |
| CephFS + NVMe (3x rep) | 20–80 ms |
| — HCI (Proxmox + Ceph) — | |
| HCI + HDD (3x rep) | 300–1.000 ms |
| HCI + SSD (3x rep) | 80–250 ms |
| HCI + NVMe (3x rep) | 25–100 ms |
| — VM + NFS (Proxmox) — | |
| VM + NFS + HDD backend | 250–800 ms |
| VM + NFS + SSD backend | 80–300 ms |
| VM + NFS + NVMe backend | 50–200 ms |
Em I/O sequencial com
iodepth=16, a latência é naturalmente mais alta que no aleatório com fila rasa — isso é esperado e não indica problema.
5.2 Escrita Sequencial Pura
Mede o throughput máximo de escrita sequencial. Métrica principal: bw_Mbit.
fio --name=seq_write \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=1M --rw=write \
--ioengine=libaio --direct=1 \
--iodepth=16 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
iops: (.write.iops | round),
lat_p50_ms: (.write.clat_ns.percentile["50.000000"] / 1000000 | round),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | round),
lat_p999_ms: (.write.clat_ns.percentile["99.900000"] / 1000000 | round)
}'Referência — bw_Mbit esperado (Mbit/s):
| Dispositivo / Configuração | Mínimo | Máximo |
|---|---|---|
| — Local — | ||
| HDD 7200 RPM | 638 Mbit/s | 1.440 Mbit/s |
| SSD SATA III | 2.800 Mbit/s | 4.240 Mbit/s |
| NVMe Gen3 | 12.000 Mbit/s | 23.990 Mbit/s |
| NVMe Gen4 | 32.000 Mbit/s | 52.010 Mbit/s |
| NVMe Gen5 | 71.970 Mbit/s | 96.010 Mbit/s |
| — NFS 1 GbE — | ||
| NFS 1 GbE + HDD backend | 461 Mbit/s | 755 Mbit/s |
| NFS 1 GbE + SSD backend | 545 Mbit/s | 839 Mbit/s |
| — VM + NFS (Proxmox) — | ||
| NFS 1 GbE + NVMe backend | 587 Mbit/s | 906 Mbit/s |
| VM + NFS + HDD backend | 336 Mbit/s | 839 Mbit/s |
| — NFS 10 GbE — | ||
| NFS 10 GbE + HDD backend | 587 Mbit/s | 1.430 Mbit/s |
| VM + NFS + SSD backend | 503 Mbit/s | 1.850 Mbit/s |
| VM + NFS + NVMe backend | 671 Mbit/s | 2.350 Mbit/s |
| NFS 10 GbE + SSD backend | 2.350 Mbit/s | 4.190 Mbit/s |
| NFS 10 GbE + NVMe backend | 2.940 Mbit/s | 6.710 Mbit/s |
| — iSCSI 1 GbE — | ||
| iSCSI 1 GbE + HDD backend | 545 Mbit/s | 839 Mbit/s |
| iSCSI 1 GbE + SSD backend | 629 Mbit/s | 906 Mbit/s |
| iSCSI 1 GbE + NVMe backend | 671 Mbit/s | 940 Mbit/s |
| — iSCSI 10 GbE — | ||
| iSCSI 10 GbE + HDD backend | 671 Mbit/s | 1.440 Mbit/s |
| iSCSI 10 GbE + SSD backend | 2.770 Mbit/s | 4.240 Mbit/s |
| iSCSI 10 GbE + NVMe backend | 3.610 Mbit/s | 8.390 Mbit/s |
| — Ceph RBD (iSCSI-like block) — | ||
| Ceph RBD + HDD (3x rep) | 252 Mbit/s | 671 Mbit/s |
| Ceph RBD + SSD (3x rep) | 839 Mbit/s | 2.520 Mbit/s |
| Ceph RBD + NVMe (3x rep) | 1.510 Mbit/s | 4.190 Mbit/s |
| Ceph RBD + NVMe (EC 4+2) | 2.520 Mbit/s | 6.710 Mbit/s |
| — CephFS (NFS-like filesystem) — | ||
| CephFS + HDD (3x rep) | 210 Mbit/s | 587 Mbit/s |
| CephFS + SSD (3x rep) | 671 Mbit/s | 2.100 Mbit/s |
| CephFS + NVMe (3x rep) | 1.260 Mbit/s | 3.770 Mbit/s |
| — Hiperconvergência (Proxmox + Ceph) — | ||
| HCI + HDD (3x rep) | 168 Mbit/s | 503 Mbit/s |
| HCI + SSD (3x rep) | 587 Mbit/s | 1.680 Mbit/s |
| HCI + NVMe (3x rep) | 1.010 Mbit/s | 3.190 Mbit/s |
Escrita sequencial em NFS com mount
syncpode ser drasticamente mais lenta queasync— o servidor confirma cada write no disco antes de responder. Verifique as opções de mount comnfsstat -m.
Referência — lat_p99_ms esperado (bs=1M, iodepth=16):
| Dispositivo / Configuração | p99 típico |
|---|---|
| — Local — | |
| HDD 7200 RPM | 150–600 ms |
| SSD SATA III | 30–100 ms |
| NVMe Gen3 | 5–25 ms |
| NVMe Gen4/5 | 2–12 ms |
| — NFS (1/10 GbE) — | |
| NFS + HDD backend | 250–800 ms |
| NFS + SSD backend | 80–250 ms |
| NFS + NVMe backend | 40–150 ms |
| — iSCSI (1/10 GbE) — | |
| iSCSI + HDD backend | 180–600 ms |
| iSCSI + SSD backend | 50–180 ms |
| iSCSI + NVMe backend | 25–100 ms |
| — Ceph RBD — | |
| Ceph RBD + HDD (3x rep) | 300–900 ms |
| Ceph RBD + SSD (3x rep) | 60–200 ms |
| Ceph RBD + NVMe (3x rep) | 20–80 ms |
| — CephFS — | |
| CephFS + HDD (3x rep) | 400–1.200 ms |
| CephFS + SSD (3x rep) | 80–280 ms |
| CephFS + NVMe (3x rep) | 30–120 ms |
| — HCI (Proxmox + Ceph) — | |
| HCI + HDD (3x rep) | 500–1.500 ms |
| HCI + SSD (3x rep) | 100–350 ms |
| HCI + NVMe (3x rep) | 40–160 ms |
| — VM + NFS (Proxmox) — | |
| VM + NFS + HDD backend | 300–1.000 ms |
| VM + NFS + SSD backend | 100–400 ms |
| VM + NFS + NVMe backend | 60–250 ms |
5.3 Mixed Read/Write Sequencial
Simula cargas que leem e escrevem ao mesmo tempo. O resultado traz read e write separados.
Ajuste
--rwmixreadconforme o perfil:70= 70% leitura / 30% escrita;30= inverso.
fio --name=seq_mixed \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=1M --rw=readwrite \
--rwmixread=50 --ioengine=libaio \
--direct=1 --iodepth=16 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
read: {
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round)
},
write: {
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
iops: (.write.iops | round),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | round)
}
}'Referência — cada direção recebe ~50% da banda total do dispositivo:
| Dispositivo / Configuração | Read bw_Mbit | Write bw_Mbit | lat_p99_ms (cada) |
|---|---|---|---|
| — Local — | |||
| HDD 7200 RPM | 419–797 Mbit/s | 419–797 Mbit/s | 200–700 ms |
| SSD SATA III | 1.590–2.220 Mbit/s | 1.590–2.220 Mbit/s | 40–120 ms |
| NVMe Gen3 | 950–14.010 Mbit/s | 950–14.010 Mbit/s | 8–30 ms |
| NVMe Gen4 | 20.010–27.990 Mbit/s | 20.010–27.990 Mbit/s | 3–15 ms |
| — NFS 1 GbE — | |||
| NFS 1 GbE + HDD backend | 2.470–3.510 Mbit/s | 2.470–3.510 Mbit/s | 250–800 ms |
| NFS 1 GbE + SSD backend | 2.820–3.870 Mbit/s | 2.820–3.870 Mbit/s | 80–300 ms |
| NFS 1 GbE + NVMe backend | 2.950–3.940 Mbit/s | 2.950–3.940 Mbit/s | 50–200 ms |
| VM + NFS + SSD backend | 336–1.170 Mbit/s | 336–1.170 Mbit/s | 100–400 ms |
| — NFS 10 GbE — | |||
| NFS 10 GbE + HDD backend | 377–797 Mbit/s | 377–797 Mbit/s | 200–600 ms |
| VM + NFS + NVMe backend | 419–1.470 Mbit/s | 419–1.470 Mbit/s | 60–250 ms |
| NFS 10 GbE + SSD backend | 1.430–2.220 Mbit/s | 1.430–2.220 Mbit/s | 40–150 ms |
| NFS 10 GbE + NVMe backend | 1.680–3.770 Mbit/s | 1.680–3.770 Mbit/s | 20–100 ms |
| — iSCSI 1 GbE — | |||
| iSCSI 1 GbE + HDD backend | 2.680–3.730 Mbit/s | 2.680–3.730 Mbit/s | 200–600 ms |
| iSCSI 1 GbE + SSD backend | 3.030–3.940 Mbit/s | 3.030–3.940 Mbit/s | 60–200 ms |
| iSCSI 1 GbE + NVMe backend | 3.160–4.010 Mbit/s | 3.160–4.010 Mbit/s | 40–150 ms |
| — iSCSI 10 GbE — | |||
| iSCSI 10 GbE + HDD backend | 403–721 Mbit/s | 403–721 Mbit/s | 180–550 ms |
| iSCSI 10 GbE + SSD backend | 1.380–2.110 Mbit/s | 1.380–2.110 Mbit/s | 35–120 ms |
| iSCSI 10 GbE + NVMe backend | 250–4.610 Mbit/s | 250–4.610 Mbit/s | 15–80 ms |
| — Ceph RBD — | |||
| Ceph RBD + HDD (3x rep) | 252–629 Mbit/s | 252–629 Mbit/s | 300–1.000 ms |
| Ceph RBD + SSD (3x rep) | 839–2.100 Mbit/s | 839–2.100 Mbit/s | 60–200 ms |
| Ceph RBD + NVMe (3x rep) | 1.510–3.770 Mbit/s | 1.510–3.770 Mbit/s | 20–80 ms |
| — CephFS — | |||
| CephFS + HDD (3x rep) | 210–545 Mbit/s | 210–545 Mbit/s | 400–1.200 ms |
| CephFS + SSD (3x rep) | 671–1.890 Mbit/s | 671–1.890 Mbit/s | 80–250 ms |
| CephFS + NVMe (3x rep) | 1.260–3.360 Mbit/s | 1.260–3.360 Mbit/s | 25–100 ms |
| — HCI (Proxmox + Ceph) — | |||
| HCI + HDD (3x rep) | 168–503 Mbit/s | 168–503 Mbit/s | 500–1.500 ms |
| HCI + SSD (3x rep) | 587–1.680 Mbit/s | 587–1.680 Mbit/s | 100–350 ms |
| HCI + NVMe (3x rep) | 1.010–3.150 Mbit/s | 1.010–3.150 Mbit/s | 40–160 ms |
| — VM + NFS (Proxmox) — | |||
| VM + NFS + HDD backend | 210–545 Mbit/s | 210–545 Mbit/s | 300–1.000 ms |
5.4 Leitura Aleatória (IOPS)
Simula queries de leitura em banco de dados, acesso a índices, cache miss. Métrica principal: iops.
Modo throughput — mede IOPS e banda máxima com fila profunda (iodepth=32 numjobs=4 = 128 I/Os simultâneos). Latências serão maiores que a latência pura do dispositivo — é o trade-off esperado.
fio --name=rand_read_throughput \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randread \
--ioengine=libaio --direct=1 \
--iodepth=32 --numjobs=4 \
--group_reporting \
--output-format=json \
| jq '.jobs[0] | {
iops: (.read.iops | round),
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
lat_p50_ms: (.read.clat_ns.percentile["50.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p999_ms: (.read.clat_ns.percentile["99.900000"] / 1000000 | (. * 100 | round) / 100)
}'Modo leitura latência pura — mede a latência mínima real do dispositivo sem concorrência (iodepth=1 numjobs=1). Use para comparar com datasheets de fabricantes e com as tabelas abaixo.
fio --name=rand_read_latency \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randread \
--ioengine=libaio --direct=1 \
--iodepth=1 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
iops: (.read.iops | round),
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
lat_p50_ms: (.read.clat_ns.percentile["50.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p999_ms: (.read.clat_ns.percentile["99.900000"] / 1000000 | (. * 100 | round) / 100)
}'As tabelas de IOPS/throughput abaixo refletem o modo throughput (iodepth=32, numjobs=4). As tabelas de latência refletem o modo latência pura (iodepth=1, numjobs=1). Compare cada resultado com a tabela correspondente ao modo que você rodou.
Referência — iops e throughput esperados (bs=4k, randread, iodepth=32, numjobs=4 — modo throughput):
| Dispositivo / Configuração | IOPS mín | IOPS máx | bw_Mbit mín | bw_Mbit máx |
|---|---|---|---|---|
| — Local — | ||||
| HDD 7200 RPM | 75 | 200 | 2.5 Mbit/s | 6.7 Mbit/s |
| SSD SATA III | 50.000 | 100.000 | 1.640 Mbit/s | 3.280 Mbit/s |
| NVMe Gen3 | 300.000 | 700.000 | 9.830 Mbit/s | 22.930 Mbit/s |
| NVMe Gen4 | 800.000 | 1.200.000 | 26.210 Mbit/s | 39.330 Mbit/s |
| NVMe Gen5 | 1.500.000 | 2.500.000 | 49.150 Mbit/s | 81.920 Mbit/s |
| — NFS 1 GbE — | ||||
| NFS 1 GbE + HDD backend | 1.000 | 5.000 | 34 Mbit/s | 168 Mbit/s |
| NFS 1 GbE + SSD backend | 5.000 | 15.000 | 168 Mbit/s | 495 Mbit/s |
| — VM + NFS (Proxmox) — | ||||
| NFS 1 GbE + NVMe backend | 8.000 | 20.000 | 260 Mbit/s | 654 Mbit/s |
| — NFS 10 GbE — | ||||
| VM + NFS + HDD backend | 800 | 3.000 | 25 Mbit/s | 101 Mbit/s |
| NFS 10 GbE + HDD backend | 2.000 | 8.000 | 67 Mbit/s | 260 Mbit/s |
| VM + NFS + SSD backend | 5.000 | 20.000 | 168 Mbit/s | 654 Mbit/s |
| NFS 10 GbE + SSD backend | 20.000 | 60.000 | 654 Mbit/s | 1.960 Mbit/s |
| VM + NFS + NVMe backend | 10.000 | 40.000 | 327 Mbit/s | 1.310 Mbit/s |
| NFS 10 GbE + NVMe backend | 40.000 | 150.000 | 1.310 Mbit/s | 4.920 Mbit/s |
| — iSCSI 1 GbE — | ||||
| iSCSI 1 GbE + HDD backend | 1.500 | 6.000 | 50 Mbit/s | 193 Mbit/s |
| iSCSI 1 GbE + SSD backend | 8.000 | 20.000 | 260 Mbit/s | 654 Mbit/s |
| iSCSI 1 GbE + NVMe backend | 10.000 | 25.000 | 327 Mbit/s | 822 Mbit/s |
| — iSCSI 10 GbE — | ||||
| iSCSI 10 GbE + HDD backend | 3.000 | 10.000 | 101 Mbit/s | 327 Mbit/s |
| iSCSI 10 GbE + SSD backend | 30.000 | 100.000 | 981 Mbit/s | 3.280 Mbit/s |
| iSCSI 10 GbE + NVMe backend | 80.000 | 300.000 | 2.630 Mbit/s | 9.830 Mbit/s |
| — Ceph RBD — | ||||
| Ceph RBD + HDD (3x rep) | 500 | 3.000 | 17 Mbit/s | 101 Mbit/s |
| Ceph RBD + SSD (3x rep) | 10.000 | 50.000 | 327 Mbit/s | 1.640 Mbit/s |
| Ceph RBD + NVMe (3x rep) | 30.000 | 150.000 | 981 Mbit/s | 4.920 Mbit/s |
| Ceph RBD + NVMe (EC 4+2) | 50.000 | 250.000 | 1.640 Mbit/s | 8.200 Mbit/s |
| — CephFS — | ||||
| CephFS + HDD (3x rep) | 300 | 2.000 | 8.4 Mbit/s | 67 Mbit/s |
| CephFS + SSD (3x rep) | 8.000 | 35.000 | 260 Mbit/s | 1.150 Mbit/s |
| CephFS + NVMe (3x rep) | 20.000 | 100.000 | 654 Mbit/s | 3.280 Mbit/s |
| — HCI (Proxmox + Ceph) — | ||||
| HCI + HDD (3x rep) | 200 | 1.500 | 8.4 Mbit/s | 50 Mbit/s |
| HCI + SSD (3x rep) | 5.000 | 25.000 | 168 Mbit/s | 822 Mbit/s |
| HCI + NVMe (3x rep) | 15.000 | 80.000 | 495 Mbit/s | 2.630 Mbit/s |
bw_Mbitem I/O aleatório 4k é derivado do IOPS:iops × 4096 ÷ 1.048.576 × 8,39. Para HDDs o valor é baixíssimo — o gargalo é a latência mecânica, não a banda.Em storage de rede, o backend define o teto de IOPS; o link define o teto de throughput. Com NVMe backend em 1 GbE, o link satura antes do disco.
Referência — lat_p99_ms esperado (bs=4k, randread, iodepth=1, numjobs=1 — latência pura):
| Dispositivo / Configuração | p50 típico | p99 típico | p99,9 típico |
|---|---|---|---|
| — Local — | |||
| HDD 7200 RPM | 8–15 ms | 10–20 ms | 15–40 ms |
| SSD SATA III | 0,05–0,15 ms | 0,10–0,30 ms | 0,20–0,80 ms |
| NVMe Gen3 | 0,02–0,08 ms | 0,05–0,15 ms | 0,10–0,40 ms |
| NVMe Gen4/5 | 0,01–0,04 ms | 0,02–0,08 ms | 0,05–0,20 ms |
| — NFS (1/10 GbE) — | |||
| NFS + HDD backend | 5,0–15,0 ms | 12,0–30,0 ms | 20,0–60,0 ms |
| NFS + SSD backend | 1,0–3,0 ms | 3,0–10,0 ms | 6,0–20,0 ms |
| NFS + NVMe backend | 0,3–1,5 ms | 1,0–5,0 ms | 2,0–12,0 ms |
| — iSCSI (1/10 GbE) — | |||
| iSCSI + HDD backend | 3,0–10,0 ms | 8,0–20,0 ms | 15,0–40,0 ms |
| iSCSI + SSD backend | 0,5–2,0 ms | 1,5–6,0 ms | 3,0–15,0 ms |
| iSCSI + NVMe backend | 0,2–0,8 ms | 0,5–2,5 ms | 1,0–6,0 ms |
| — Ceph RBD — | |||
| Ceph RBD + HDD (3x rep) | 10,0–25,0 ms | 20,0–60,0 ms | 40,0–120,0 ms |
| Ceph RBD + SSD (3x rep) | 1,0–4,0 ms | 3,0–12,0 ms | 6,0–25,0 ms |
| Ceph RBD + NVMe (3x rep) | 0,3–1,5 ms | 1,0–5,0 ms | 2,0–12,0 ms |
| — CephFS — | |||
| CephFS + HDD (3x rep) | 15,0–35,0 ms | 25,0–80,0 ms | 50,0–150,0 ms |
| CephFS + SSD (3x rep) | 2,0–6,0 ms | 5,0–18,0 ms | 10,0–35,0 ms |
| CephFS + NVMe (3x rep) | 0,5–2,0 ms | 1,5–6,0 ms | 3,0–15,0 ms |
| — HCI (Proxmox + Ceph) — | |||
| HCI + HDD (3x rep) | 20,0–50,0 ms | 35,0–100,0 ms | 60,0–200,0 ms |
| HCI + SSD (3x rep) | 3,0–8,0 ms | 6,0–20,0 ms | 12,0–40,0 ms |
| HCI + NVMe (3x rep) | 1,0–3,0 ms | 2,0–8,0 ms | 4,0–18,0 ms |
| — VM + NFS (Proxmox) — | |||
| VM + NFS + HDD backend | 8,0–20,0 ms | 15,0–40,0 ms | 25,0–80,0 ms |
| VM + NFS + SSD backend | 3,0–7,0 ms | 5,0–15,0 ms | 8,0–25,0 ms |
| VM + NFS + NVMe backend | 2,0–5,0 ms | 4,0–12,0 ms | 6,0–20,0 ms |
5.5 Escrita Aleatória (IOPS)
Simula alto volume de inserções, updates e journaling de filesystem. Métrica principal: iops.
Modo throughput — mede IOPS e banda máxima com fila profunda.
fio --name=rand_write_throughput \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randwrite \
--ioengine=libaio --direct=1 \
--iodepth=32 --numjobs=4 \
--group_reporting \
--output-format=json \
| jq '.jobs[0] | {
iops: (.write.iops | round),
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
lat_p50_ms: (.write.clat_ns.percentile["50.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p999_ms: (.write.clat_ns.percentile["99.900000"] / 1000000 | (. * 100 | round) / 100)
}'Modo latência pura — mede a latência mínima de escrita sem concorrência.
fio --name=rand_write_latency \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randwrite \
--ioengine=libaio --direct=1 \
--iodepth=1 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
iops: (.write.iops | round),
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
lat_p50_ms: (.write.clat_ns.percentile["50.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100),
lat_p999_ms: (.write.clat_ns.percentile["99.900000"] / 1000000 | (. * 100 | round) / 100)
}'As tabelas de IOPS/throughput abaixo refletem o modo throughput (iodepth=32, numjobs=4). As tabelas de latência refletem o modo latência pura (iodepth=1, numjobs=1).
Referência — iops e throughput esperados (bs=4k, randwrite, iodepth=32, numjobs=4 — modo throughput):
| Dispositivo / Configuração | IOPS mín | IOPS máx | bw_Mbit mín | bw_Mbit máx |
|---|---|---|---|---|
| — Local — | ||||
| HDD 7200 RPM | 75 | 150 | 2.5 Mbit/s | 5.0 Mbit/s |
| SSD SATA III | 40.000 | 90.000 | 1.310 Mbit/s | 2.950 Mbit/s |
| NVMe Gen3 | 200.000 | 600.000 | 6.550 Mbit/s | 19.660 Mbit/s |
| NVMe Gen4 | 600.000 | 1.000.000 | 19.660 Mbit/s | 32.770 Mbit/s |
| NVMe Gen5 | 1.200.000 | 2.000.000 | 39.330 Mbit/s | 65.540 Mbit/s |
| — NFS 1 GbE — | ||||
| NFS 1 GbE + HDD backend | 500 | 3.000 | 17 Mbit/s | 101 Mbit/s |
| NFS 1 GbE + SSD backend | 3.000 | 10.000 | 101 Mbit/s | 327 Mbit/s |
| — VM + NFS (Proxmox) — | ||||
| NFS 1 GbE + NVMe backend | 5.000 | 15.000 | 168 Mbit/s | 495 Mbit/s |
| — NFS 10 GbE — | ||||
| VM + NFS + HDD backend | 400 | 2.000 | 17 Mbit/s | 67 Mbit/s |
| NFS 10 GbE + HDD backend | 1.000 | 5.000 | 34 Mbit/s | 168 Mbit/s |
| VM + NFS + SSD backend | 3.000 | 12.000 | 101 Mbit/s | 394 Mbit/s |
| VM + NFS + NVMe backend | 5.000 | 25.000 | 168 Mbit/s | 822 Mbit/s |
| NFS 10 GbE + SSD backend | 10.000 | 40.000 | 327 Mbit/s | 1.310 Mbit/s |
| NFS 10 GbE + NVMe backend | 20.000 | 80.000 | 654 Mbit/s | 2.630 Mbit/s |
| — iSCSI 1 GbE — | ||||
| iSCSI 1 GbE + HDD backend | 800 | 4.000 | 25 Mbit/s | 134 Mbit/s |
| iSCSI 1 GbE + SSD backend | 5.000 | 15.000 | 168 Mbit/s | 495 Mbit/s |
| iSCSI 1 GbE + NVMe backend | 8.000 | 20.000 | 260 Mbit/s | 654 Mbit/s |
| — iSCSI 10 GbE — | ||||
| iSCSI 10 GbE + HDD backend | 2.000 | 8.000 | 67 Mbit/s | 260 Mbit/s |
| iSCSI 10 GbE + SSD backend | 20.000 | 70.000 | 654 Mbit/s | 2.290 Mbit/s |
| iSCSI 10 GbE + NVMe backend | 50.000 | 200.000 | 1.640 Mbit/s | 6.550 Mbit/s |
| — Ceph RBD — | ||||
| Ceph RBD + HDD (3x rep) | 200 | 1.500 | 8.4 Mbit/s | 50 Mbit/s |
| Ceph RBD + SSD (3x rep) | 5.000 | 25.000 | 168 Mbit/s | 822 Mbit/s |
| Ceph RBD + NVMe (3x rep) | 15.000 | 80.000 | 495 Mbit/s | 2.630 Mbit/s |
| Ceph RBD + NVMe (EC 4+2) | 8.000 | 40.000 | 260 Mbit/s | 1.310 Mbit/s |
| — CephFS — | ||||
| CephFS + HDD (3x rep) | 150 | 1.000 | 8.4 Mbit/s | 34 Mbit/s |
| CephFS + SSD (3x rep) | 3.000 | 15.000 | 101 Mbit/s | 495 Mbit/s |
| CephFS + NVMe (3x rep) | 8.000 | 50.000 | 260 Mbit/s | 1.640 Mbit/s |
| — HCI (Proxmox + Ceph) — | ||||
| HCI + HDD (3x rep) | 100 | 800 | <8.4 Mbit/s | 25 Mbit/s |
| HCI + SSD (3x rep) | 2.000 | 10.000 | 67 Mbit/s | 327 Mbit/s |
| HCI + NVMe (3x rep) | 5.000 | 30.000 | 168 Mbit/s | 981 Mbit/s |
Referência — lat_p99_ms esperado (bs=4k, randwrite, iodepth=1, numjobs=1 — latência pura):
| Dispositivo / Configuração | p50 típico | p99 típico | p99,9 típico |
|---|---|---|---|
| — Local — | |||
| HDD 7200 RPM | 8–15 ms | 12–25 ms | 20–60 ms |
| SSD SATA III | 0,05–0,20 ms | 0,15–0,50 ms | 0,50–2,00 ms |
| NVMe Gen3 | 0,02–0,10 ms | 0,08–0,25 ms | 0,20–1,00 ms |
| NVMe Gen4/5 | 0,01–0,05 ms | 0,03–0,12 ms | 0,10–0,50 ms |
| — NFS (1/10 GbE) — | |||
| NFS + HDD backend | 8,0–20,0 ms | 15,0–40,0 ms | 30,0–100,0 ms |
| NFS + SSD backend | 2,0–6,0 ms | 5,0–18,0 ms | 10,0–40,0 ms |
| NFS + NVMe backend | 0,5–2,0 ms | 2,0–8,0 ms | 4,0–18,0 ms |
| — iSCSI (1/10 GbE) — | |||
| iSCSI + HDD backend | 5,0–15,0 ms | 10,0–30,0 ms | 20,0–70,0 ms |
| iSCSI + SSD backend | 0,8–3,0 ms | 2,5–10,0 ms | 5,0–25,0 ms |
| iSCSI + NVMe backend | 0,3–1,0 ms | 1,0–4,0 ms | 2,0–10,0 ms |
| — Ceph RBD — | |||
| Ceph RBD + HDD (3x rep) | 15,0–40,0 ms | 30,0–80,0 ms | 60,0–180,0 ms |
| Ceph RBD + SSD (3x rep) | 2,0–6,0 ms | 5,0–20,0 ms | 10,0–50,0 ms |
| Ceph RBD + NVMe (3x rep) | 0,5–2,0 ms | 2,0–8,0 ms | 4,0–20,0 ms |
| — CephFS — | |||
| CephFS + HDD (3x rep) | 20,0–60,0 ms | 40,0–120,0 ms | 80,0–250,0 ms |
| CephFS + SSD (3x rep) | 3,0–10,0 ms | 8,0–30,0 ms | 15,0–70,0 ms |
| CephFS + NVMe (3x rep) | 1,0–4,0 ms | 3,0–12,0 ms | 6,0–30,0 ms |
| — HCI (Proxmox + Ceph) — | |||
| HCI + HDD (3x rep) | 30,0–80,0 ms | 60,0–180,0 ms | 120,0–400,0 ms |
| HCI + SSD (3x rep) | 5,0–15,0 ms | 10,0–40,0 ms | 20,0–90,0 ms |
| HCI + NVMe (3x rep) | 2,0–6,0 ms | 4,0–15,0 ms | 8,0–35,0 ms |
| — VM + NFS (Proxmox) — | |||
| VM + NFS + HDD backend | 10,0–25,0 ms | 20,0–60,0 ms | 40,0–120,0 ms |
| VM + NFS + SSD backend | 4,0–9,0 ms | 7,0–20,0 ms | 12,0–45,0 ms |
| VM + NFS + NVMe backend | 3,0–6,0 ms | 5,0–15,0 ms | 8,0–30,0 ms |
Escrita aleatória tende a ter latência p99 e p99,9 mais alta que leitura no mesmo dispositivo — SSDs executam operações internas de garbage collection e wear leveling que podem causar stalls pontuais. Em NFS, escrita também pode ser afetada por flush de cache do servidor.
5.6 Mixed Aleatório — OLTP (70/30)
Simula carga típica de banco de dados OLTP: 70% leitura / 30% escrita aleatória. Resultado traz read e write separados.
Modo throughput — simula carga OLTP real com fila profunda (iodepth=64, numjobs=4). As latências refletidas aqui são as de produção sob carga, não a latência pura do dispositivo.
fio --name=oltp_throughput \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randrw \
--rwmixread=70 --ioengine=libaio \
--direct=1 --iodepth=64 --numjobs=4 \
--group_reporting \
--output-format=json \
| jq '.jobs[0] | {
read: {
iops: (.read.iops | round),
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100)
},
write: {
iops: (.write.iops | round),
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100)
}
}'Modo latência pura — mede a latência de acesso OLTP sem concorrência, para comparar com os valores das tabelas abaixo.
fio --name=oltp_latency \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=4k --rw=randrw \
--rwmixread=70 --ioengine=libaio \
--direct=1 --iodepth=1 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
read: {
iops: (.read.iops | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100)
},
write: {
iops: (.write.iops | round),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | (. * 100 | round) / 100)
}
}'Referência — IOPS total (read + write combinados), bs=4k, mix 70/30, iodepth=64, numjobs=4 — modo throughput:
| Dispositivo / Configuração | IOPS total | bw_Mbit read | bw_Mbit write | lat_p99_ms |
|---|---|---|---|---|
| — Local — | ||||
| HDD 7200 RPM | 100–250 | <8.4 Mbit/s | <8.4 Mbit/s | 10–25 ms |
| SSD SATA III | 60.000–130.000 | 839–1.640 Mbit/s | 361–705 Mbit/s | 0,15–0,40 ms |
| NVMe Gen3 | 350.000–900.000 | 950–20.640 Mbit/s | 408–8.850 Mbit/s | 0,08–0,20 ms |
| NVMe Gen4 | 900.000–1.500.000 | 2.461–34.410 Mbit/s | 1.055–14.750 Mbit/s | 0,03–0,10 ms |
| — NFS 1 GbE — | ||||
| NFS 1 GbE + HDD backend | 1.000–5.000 | 3–117 Mbit/s | 1–50 Mbit/s | 8,0–25,0 ms |
| NFS 1 GbE + SSD backend | 4.000–14.000 | 11–319 Mbit/s | 5–134 Mbit/s | 4,0–15,0 ms |
| NFS 1 GbE + NVMe backend | 6.000–18.000 | 134–411 Mbit/s | 7–176 Mbit/s | 3,0–12,0 ms |
| — NFS 10 GbE — | ||||
| VM + NFS + SSD backend | 4.000–15.000 | 11–344 Mbit/s | 5–151 Mbit/s | 5,0–18,0 ms |
| NFS 10 GbE + HDD backend | 2.000–8.000 | 5–185 Mbit/s | 2–75 Mbit/s | 6,0–20,0 ms |
| VM + NFS + NVMe backend | 8.000–35.000 | 185–805 Mbit/s | 9–344 Mbit/s | 4,0–14,0 ms |
| NFS 10 GbE + SSD backend | 15.000–55.000 | 344–1.260 Mbit/s | 151–537 Mbit/s | 2,0–8,0 ms |
| NFS 10 GbE + NVMe backend | 30.000–120.000 | 688–2.750 Mbit/s | 294–1.180 Mbit/s | 1,0–5,0 ms |
| — iSCSI 1 GbE — | ||||
| iSCSI 1 GbE + HDD backend | 1.500–6.000 | 4–134 Mbit/s | 2–59 Mbit/s | 6,0–20,0 ms |
| iSCSI 1 GbE + SSD backend | 6.000–18.000 | 134–411 Mbit/s | 7–176 Mbit/s | 3,0–10,0 ms |
| iSCSI 1 GbE + NVMe backend | 8.000–22.000 | 185–503 Mbit/s | 9–218 Mbit/s | 2,0–8,0 ms |
| — iSCSI 10 GbE — | ||||
| iSCSI 10 GbE + HDD backend | 3.000–10.000 | 8–226 Mbit/s | 3–101 Mbit/s | 5,0–18,0 ms |
| iSCSI 10 GbE + SSD backend | 25.000–80.000 | 570–1.840 Mbit/s | 243–789 Mbit/s | 1,5–6,0 ms |
| iSCSI 10 GbE + NVMe backend | 60.000–220.000 | 1.380–5.050 Mbit/s | 587–2.160 Mbit/s | 0,5–3,0 ms |
| — Ceph RBD — | ||||
| Ceph RBD + HDD (3x rep) | 300–2.000 | 1–42 Mbit/s | <1–17 Mbit/s | 20,0–60,0 ms |
| Ceph RBD + SSD (3x rep) | 8.000–40.000 | 185–914 Mbit/s | 9–394 Mbit/s | 4,0–15,0 ms |
| Ceph RBD + NVMe (3x rep) | 20.000–120.000 | 461–2.750 Mbit/s | 193–1.180 Mbit/s | 1,5–6,0 ms |
| — CephFS — | ||||
| CephFS + HDD (3x rep) | 200–1.200 | 1–25 Mbit/s | <8.4 Mbit/s | 30,0–90,0 ms |
| CephFS + SSD (3x rep) | 5.000–25.000 | 117–570 Mbit/s | 6–243 Mbit/s | 6,0–20,0 ms |
| CephFS + NVMe (3x rep) | 12.000–80.000 | 277–1.840 Mbit/s | 117–789 Mbit/s | 2,0–8,0 ms |
| — HCI (Proxmox + Ceph) — | ||||
| HCI + HDD (3x rep) | 100–800 | <8.4 Mbit/s | <8.4 Mbit/s | 40,0–120,0 ms |
| HCI + SSD (3x rep) | 3.000–15.000 | 8–344 Mbit/s | 3–151 Mbit/s | 8,0–25,0 ms |
| HCI + NVMe (3x rep) | 8.000–40.000 | 185–914 Mbit/s | 9–394 Mbit/s | 3,0–12,0 ms |
| — VM + NFS (Proxmox) — | ||||
| VM + NFS + HDD backend | 800–3.000 | 2–67 Mbit/s | 1–25 Mbit/s | 12,0–35,0 ms |
bw_Mbitread e write no mix 70/30 refletem a proporção: read recebe ~70% das operações, write ~30%.
5.7 Storage em Rede (NFS, iSCSI, SAN, Ceph, HCI)
Quando o --filename aponta para um mount de rede, o FIO mede toda a cadeia: disco remoto + protocolo + stack de rede + latência do switch. Os valores serão sistematicamente piores que os de disco local — isso é esperado.
Ceph e Hiperconvergência — pontos específicos
O Ceph adiciona camadas além do protocolo de rede:
| Fator | Impacto |
|---|---|
| Replicação 3x | Cada escrita precisa ser confirmada em 3 OSDs antes de retornar ACK — latência de escrita é dominada pelo OSD mais lento |
| Erasure Coding (EC 4+2) | Melhor throughput de leitura que 3x rep; escrita mais lenta por overhead de codificação |
| CRUSH map / PG placement | Operações podem cruzar nós e racks — latência depende da topologia |
| OSD journal/WAL | Com WAL em NVMe e dados em HDD, escrita é rápida mas leitura ainda acessa HDD |
| Rede de cluster Ceph | Tráfego de replicação e rebalanceamento compete com I/O de cliente — recomendado rede dedicada |
| HCI (hiperconvergência) | VM e OSDs Ceph no mesmo host competem por CPU, rede e cache — latência mais alta e menos previsível que Ceph dedicado |
OSD WAL em NVMe: uma configuração comum é usar NVMe como WAL/DB e HDD como dados. O FIO verá latência de escrita próxima ao NVMe, mas leitura aleatória ainda será limitada pelo HDD — os valores de "HDD backend" nas tabelas representam esse cenário.
Antes de rodar, identifique o mount:
# Ver tipo e opções do mount
mount | grep /mnt/storage
# Ver latência base da rede para o storage server
ping -c 20 <ip-do-storage-server>A latência do
pingé o piso absoluto de qualquer operação de I/O no storage. Se o ping já é 2 ms, nenhuma operação será mais rápida que isso — independente do disco remoto.
Referência — throughput sequencial (bs=1M) por tipo de storage em rede:
| Protocolo / Tecnologia | Throughput típico | Condição |
|---|---|---|
| NFS v3/v4 — 1 GbE | 5.630–7.740 Mbit/s | Limitado pelo link (teto ~998 Mbit/s) |
| NFS v3/v4 — 10 GbE | 400–7.550 Mbit/s | Depende do storage backend e CPU do servidor |
| NFS v4.2 — 25/100 GbE | 1.000–41.940 Mbit/s | Alta performance; requer tuning de rsize/wsize |
| CIFS/SMB3 — 1 GbE | 503–839 Mbit/s | Overhead de protocolo maior que NFS |
| CIFS/SMB3 — 10 GbE | 300–5.870 Mbit/s | SMB Multichannel pode ajudar |
| iSCSI — 1 GbE | 671–965 Mbit/s | Mais próximo do disco local que NFS |
| iSCSI — 10 GbE | 500–9.230 Mbit/s | Block-level; menor overhead de protocolo |
| Fibre Channel (FC) 8G | 5.870–7.550 Mbit/s | ~6.710 Mbit/s teórico por porta |
| Fibre Channel (FC) 16G | 11.740–14.260 Mbit/s | Muito comum em SANs corporativas |
| Fibre Channel (FC) 32G | 23.490–28.520 Mbit/s | Tipicamente com multipathing |
Referência — latência por protocolo em rede (bs=4k, randread):
| Protocolo | lat_p50_ms típico | lat_p99_ms típico |
|---|---|---|
| NFS — 1/10 GbE (LAN local) | 0,3–1,5 ms | 2–10 ms |
| NFS — WAN ou alta carga | 5–50 ms | 50–200 ms |
| iSCSI — 1/10 GbE | 0,2–1,0 ms | 1–8 ms |
| Fibre Channel | 0,1–0,5 ms | 0,5–3 ms |
| NVMe-oF (RDMA/RoCE) | 0,05–0,2 ms | 0,2–1 ms |
Pontos de atenção específicos para storage em rede:
| Sintoma no FIO | Causa provável |
|---|---|
| bw_Mbit próximo de 998 Mbit/s e não sobe | Link saturado em 1 GbE |
| lat_p999_ms muito acima do p99 | Retransmissões TCP ou congestionamento de switch |
| IOPS muito abaixo do esperado com bs=4k | Opções rsize/wsize do NFS pequenas (padrão 4k–64k) |
| Throughput cai com numjobs > 1 | Storage server com CPU saturada ou lock contention |
| bw_Mbit inconsistente entre runs | QoS ou throttling ativo no storage |
Opções de mount NFS recomendadas para benchmarks:
# Montar com rsize/wsize altos para maximizar throughput
mount -t nfs -o rsize=1048576,wsize=1048576,hard,timeo=600 \
<servidor>:/export /mnt/storage
# Verificar opções ativas após o mount
nfsstat -m
rsizeewsizecontrolam o tamanho dos blocos de transferência NFS. O padrão costuma ser 64k–256k, o que limita o throughput mesmo em links de 10 GbE. Alinhe com o--bsdo FIO para resultados representativos.
5.8 iodepth e numjobs por Tipo de Dispositivo
| Dispositivo | iodepth recomendado | numjobs recomendado |
|---|---|---|
| HDD | 8–16 | 1–2 |
| SSD SATA | 16–32 | 1–4 |
| NVMe Gen3 | 32–64 | 4–8 |
| NVMe Gen4/5 | 64–128 | 4–16 |
| NFS / iSCSI | 32–64 | 4–8 |
| FC / NVMe-oF | 64–128 | 4–16 |
5.9 Limpeza Após os Testes
rm -f /home/$USER/fio_test.tmp6. Interpretação da Saída
6.1 Saída no Formato Normal (--output-format=normal)
Exemplo de saída para leitura sequencial:
seq_read: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, ioengine=libaio, iodepth=16
fio-3.33
Starting 1 process
seq_read: (groupid=0, jobs=1): err= 0: pid=12345: ...
read: IOPS=512, BW=4.290 Mbit/s (537MB/s)(2048MiB/4000msec)
slat (usec): min=5, max=320, avg=12.50, stdev=8.20
clat (msec): min=1, max=85, avg=31.2, stdev=4.8
lat (msec): min=1, max=85, avg=31.3
clat percentiles (msec):
| 1.00th=[ 26], 5.00th=[ 28], 10.00th=[ 29], 20.00th=[ 29],
| 50.00th=[ 31], 75.00th=[ 33], 90.00th=[ 36], 95.00th=[ 38],
| 99.00th=[ 46], 99.50th=[ 51], 99.90th=[ 64], 99.99th=[ 85]
cpu : usr=0.50%, sys=2.00%, ctx=2048, majf=0, minf=16399
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=99.5%, 32=0.0%
Run status group 0 (all jobs):
READ: bw=4.290 Mbit/s (537MB/s), 4.290 Mbit/s-4.290 Mbit/s, io=2048MiB, run=4000-4000msec6.2 O que cada linha significa
| Campo | Significado |
|---|---|
| IOPS=512 | 512 operações de I/O por segundo |
| BW=4.290 Mbit/s | Throughput em mebibytes por segundo |
| (537MB/s) | Mesmo valor em megabytes decimais (1 MiB = 1.048 MB) |
| slat | Submission latency — tempo para submeter a operação ao kernel |
| clat | Completion latency — tempo do kernel até completar a operação |
| lat | Latência total: slat + clat |
| clat percentiles | Distribuição estatística das latências — p99 é o mais crítico |
| cpu usr/sys | Uso de CPU em userspace e kernel durante o teste |
| IO depths | Distribuição real das operações em fila |
6.3 Sinais de Alerta na Saída
| Situação | O que pode indicar |
|---|---|
| BW muito acima do esperado para o hardware | /tmp é tmpfs — testando RAM |
| clat p99 muito maior que a média | Stalls periódicos (GC de SSD, throttling térmico) |
| cpu sys acima de 20% | Saturação do driver ou limite de IRQ |
| IO depths: 1=99% com iodepth=16 | Device não suporta filas profundas (HDD ou driver limitado) |
7. Parsing da Saída
A saída padrão do FIO (--output-format=normal) é verbosa e difícil de processar. O melhor fluxo é usar --output-format=json e pipar diretamente para jq, sem salvar arquivo intermediário — o resultado aparece limpo no terminal assim que o teste termina.
Unidades no JSON:
bwvem em KiB/s (dividir por 1024 para MiB/s). Latências vêm em nanossegundos (dividir por 1.000.000 para ms).
7.1 Resumo Direto no Terminal
Pipe do FIO para jq em uma única linha — sem arquivo intermediário:
fio --name=seq_read \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=1M --rw=read \
--ioengine=libaio --direct=1 \
--iodepth=16 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
job: .jobname,
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p50_ms: (.read.clat_ns.percentile["50.000000"] / 1000000 | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round),
lat_p999_ms: (.read.clat_ns.percentile["99.900000"] / 1000000 | round)
}'Saída:
{
"job": "seq_read",
"bw_Mbit": 4295,
"iops": 512,
"lat_p50_ms": 31,
"lat_p99_ms": 46,
"lat_p999_ms": 64
}7.2 Resumo para Testes Mixed (Leitura + Escrita)
Quando o teste tem --rw=readwrite ou --rw=randrw, o JSON separa as métricas em .read e .write:
fio --name=seq_mixed \
--filename=/home/$USER/fio_test.tmp \
--size=2G --bs=1M --rw=readwrite \
--rwmixread=50 --ioengine=libaio \
--direct=1 --iodepth=16 --numjobs=1 \
--output-format=json \
| jq '.jobs[0] | {
job: .jobname,
read: {
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round)
},
write: {
bw_Mbit: (.write.bw / 1024 * 8.388608 | round),
iops: (.write.iops | round),
lat_p99_ms: (.write.clat_ns.percentile["99.000000"] / 1000000 | round)
}
}'7.3 Múltiplos Jobs com --numjobs > 1
Com --numjobs=4 --group_reporting, o FIO agrega os resultados em um único job. O pipe funciona da mesma forma — basta trocar .jobs[0] pelo nome do job ou usar .jobs[] | select(.jobname == "nome"):
fio ... --numjobs=4 --group_reporting --output-format=json \
| jq '.jobs[] | select(.jobname == "rand_read") | {
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round)
}'7.4 Salvar JSON e Consultar Depois
Se preferir guardar o resultado para análise posterior:
# Salvar
fio ... --output-format=json --output=resultado.json
# Consultar depois com jq
jq '.jobs[0] | {
bw_Mbit: (.read.bw / 1024 * 8.388608 | round),
iops: (.read.iops | round),
lat_p99_ms: (.read.clat_ns.percentile["99.000000"] / 1000000 | round)
}' resultado.json7.5 Exportar Múltiplos Resultados para CSV
Útil para consolidar uma bateria de testes em planilha:
#!/bin/bash
# fio_to_csv.sh — agrega múltiplos JSONs do FIO em CSV
# Uso: bash fio_to_csv.sh resultado_*.json > resultados.csv
echo "arquivo,job,read_bw_Mbit,read_iops,read_p99_ms,write_bw_Mbit,write_iops,write_p99_ms"
for f in "$@"; do
jq -r '.jobs[0] | [
"'$f'",
.jobname,
(.read.bw / 1024 | round),
(.read.iops | round),
(.read.clat_ns.percentile["99.000000"] / 1000000 | round),
(.write.bw / 1024 | round),
(.write.iops | round),
(.write.clat_ns.percentile["99.000000"] / 1000000 | round)
] | @csv' "$f"
donebash fio_to_csv.sh resultado_*.json > resultados.csv8. Referências de Performance
8.1 Throughput Sequencial (bs=1M)
| Dispositivo | Leitura | Escrita |
|---|---|---|
| HDD 7200 RPM | 100–200 MB/s | 80–180 MB/s |
| SSD SATA III | 400–560 MB/s | 350–530 MB/s |
| NVMe PCIe Gen3 | 2.000–3.500 MB/s | 1.500–3.000 MB/s |
| NVMe PCIe Gen4 | 5.000–7.000 MB/s | 4.000–6.500 MB/s |
| NVMe PCIe Gen5 | 10.000–14.000 MB/s | 9.000–12.000 MB/s |
8.2 IOPS Aleatório (bs=4k)
| Dispositivo | Leitura | Escrita |
|---|---|---|
| HDD 7200 RPM | 75–200 IOPS | 75–150 IOPS |
| SSD SATA III | 50.000–100.000 IOPS | 40.000–90.000 IOPS |
| NVMe PCIe Gen3 | 300.000–700.000 IOPS | 200.000–600.000 IOPS |
| NVMe PCIe Gen4 | 800.000–1.200.000 IOPS | 600.000–1.000.000 IOPS |
| NVMe PCIe Gen5 | 1.500.000–2.500.000 IOPS | 1.200.000–2.000.000 IOPS |
8.3 Latência Aleatória (bs=4k, iodepth=1)
| Dispositivo | Latência média |
|---|---|
| HDD 7200 RPM | 5–15 ms |
| SSD SATA III | 0,05–0,1 ms |
| NVMe PCIe Gen3 | 0,02–0,05 ms |
| NVMe PCIe Gen4/5 | 0,01–0,03 ms |
Latências acima de 2x o valor de referência indicam possível throttling térmico, fila saturada ou problema de driver.
9. Checklist de Execução
[ ] Verificar se
/tmpétmpfscomdf -hT /tmp[ ] Confirmar espaço livre ≥ 2× o valor de
--size[ ] Encerrar outras cargas de I/O durante o teste
[ ] Anotar o tipo do dispositivo testado (HDD / SSD SATA / NVMe Gen)
[ ] Usar
--output-format=jsonpara resultados parseáveis[ ] Remover o arquivo de teste ao concluir
[ ] Comparar resultados com as referências embutidas em cada cenário (seção 5)
[ ] Verificar p99 de latência — médias podem esconder stalls pontuais
