Vou reformular sua pergunta para destacar alguns dos contextos:
Why is
fio --name=seqwrite --rw=write --bs=128k --numjobs=1 --size=16G --runtime=120 --iodepth=1 --group_reporting
faster than
time dd if=/dev/random of=./test_file bs=128k count=131072
on a FreeBSD 11.2 system with 768GB RAM, SAS HDDs and ZFS configured as a RAIDZ2 with compression enabled?
A principal diferença é que o fio está preparando o arquivo antes de fazer os testes de tempo:
seqwrite: Laying out IO file (1 file / 16384MiB)
considerando que dd
provavelmente está fazendo gravações de extensão de arquivo (o que causará atualizações de metadados). Além disso, você tem muita memória RAM (768G) e está escrevendo tão poucos dados em comparação a ela (16G). Há uma strong chance de suas gravações serem armazenadas na RAM (e não gravadas no disco até muito mais tarde). Isso provavelmente está no caso fio
em que o arquivo foi pré-criado e muito pouco metadados de arquivo precisa ser modificado por E / S. Você pode pelo menos dizer ao fio para não dizer que está pronto até que todos os dados escritos sejam escritos do kernel no final do trabalho usando end_fsync=1
.
(NB: Há uma dica sutil de que a E / S está sendo armazenada em buffer quando você vê latências de conclusão muito menores do que o que você sabe que seu disco pode fazer:
clat (usec): min=28, max=2585, avg=48.03, stdev=24.04
O seu disco giratório pode realmente completar uma E / S em 28 microssegundos? Se não é provável que tenha buffer em algum lugar)
Finalmente, o padrão é reutilizar o mesmo padrão nos blocos subseqüentes . Como há compactação acontecendo, isso pode melhorar ainda mais sua taxa de transferência de fio
(mas isso dependerá de itens como o tamanho do registro do ZFS). Para verificar isso, informe ao fio para tornar seus buffers incompressíveis (o que, por sua vez, transforma refill_buffers
on) e veja se a taxa de transferência cai (o que aconteceu no seu caso).
TLDR; Os comandos fio
e dd
que você deu não estão testando a mesma coisa. Você precisa estar ciente de coisas como se seus arquivos já existem no tamanho correto, quão compactáveis são os dados que você está escrevendo e se você está respondendo por coisas como buffer de kernel escrevendo poucos dados e não verificando se tudo foi escrito de volta para o disco.