De acordo com a maioria dos benchmarks de disco, as velocidades de gravação sequencial são geralmente muito próximas das velocidades de leitura. Os meus estão na faixa de ~500 MB/s.
$ dd if=/dev/zero of=tempfile bs=1M count=5120 conv=notrunc oflag=direct status=progress
5291114496 bytes (5,3 GB, 4,9 GiB) copied, 11 s, 481 MB/s
5120+0 records in
5120+0 records out
5368709120 bytes (5,4 GB, 5,0 GiB) copied, 11,1929 s, 480 MB/s
$ dd if=/dev/zero of=tempfile bs=1024M count=5 conv=notrunc oflag=direct status=progress
5368709120 bytes (5,4 GB, 5,0 GiB) copied, 11 s, 490 MB/s
5+0 records in
5+0 records out
5368709120 bytes (5,4 GB, 5,0 GiB) copied, 10,9524 s, 490 MB/s
Como você pode ver, dd relata uma média acima de 480 MB/s com bs=1M e 490 MB/s com bs=1024M. (Além disso, o fio relata que as velocidades de leitura são superiores a dd em 20-30 MB / s, o que é interessante, mas não é um problema para mim)
$ fio --ioengine=libaio --size=1024m --filename=$HOME/tempfile --direct=1 --loops=5 --name=test --bs=1m --rw=write
....
write: IOPS=146, BW=147MiB/s (154MB/s)(5120MiB/34894msec); 0 zone resets
$ fio --ioengine=libaio --size=1024m --filename=$HOME/tempfile --direct=1 --loops=5 --name=test --bs=1024m --rw=write
....
write: IOPS=0, BW=144MiB/s (151MB/s)(5120MiB/35458msec); 0 zone resets
Como você pode ver, o fio reporta ~154 MB/s em vez de bs=1m e 151 MB/s com bs=1024m. (um valor surpreendentemente ainda mais baixo...)
O que está fazendo com que o fio transfira arquivos tão devagar e como posso configurá-lo para escrever mais próximo da velocidade do dd?
(Como nota lateral, notei ao procurar soluções para isso que muitos usuários realmente pensam que suas velocidades de gravação são tão lentas quanto os relatórios do fio, e fazem perguntas para entender por que suas gravações são tão lentas, até vi NVME testes de unidade em que vi velocidades de gravação na metade do que as leituras eram, e ninguém parecia nem notar que algo estava errado ...
O motivo da diferença me foi explicado pelo autor de fio: o
dd
comando que usei estava escrevendo zeros enquantofio
estava usando dados aleatórios por padrão. Definir --zero_buffers=1 resolve o problema.e
Agora tem resultados muito mais próximos. (Deve-se notar que, embora esses resultados realmente mostrem uma aproximação das velocidades de gravação máximas teóricas da unidade; testar sem essa opção (usando buffers aleatórios) fornecerá resultados mais indicativos do desempenho de E/S do mundo real.)