Eu tenho o script de shell abaixo e me pergunto se o oflag 's direct faz a sincronização automaticamente ou se é explicitamente necessário:
dd bs=10M oflag=direct,sync of=ofile.bin
Além disso, qual é a diferença em dizer oflag=sync e conv=sync e conv=fsync ?
Qual é o impacto se eu alterar o código para a linha abaixo?
dd bs=10M conv=fsync oflag=direct of=ofile.bin
Nós provavelmente podemos descartar
conv=sync
para começar. Ele faz algo bastante diferente, o que eu espero que você não queira :-).oflag=direct
não sincroniza automaticamente por conta própria.[*]conv=fsync
difere deoflag=sync
.oflag=sync
sincroniza efetivamente após cada bloco de saída.conv=fsync
faz uma sincronização no final.O resultado final é o mesmo, mas o desempenho ao longo do caminho é diferente :-).
oflag=sync
poderia ser significativamente mais lento. Você pode atenuar isso, aumentando o tamanho do bloco.Se os caches específicos do dispositivo forem grandes[1], isso afetará o progresso relatado, por exemplo, pela
status=progress
opção.Se você não usar
oflag=direct
, grandes quantidades de gravações podem se acumular no cache da página do sistema. Esse acúmulo afetará o progresso que você vê[2]. Mas também, o Linux às vezes responde mal ao build-up e degrada o desempenho de todos os dispositivos[3].[1] "Aparentemente seu hardware tem centenas de megabytes de cache... No meu caso, é porque o kernel está [realmente rodando dentro de uma máquina virtual]". https://unix.stackexchange.com/a/420300/29483
[2] Por que um pipeline gunzip para dd fica mais lento no final?
[3] O sistema fica lento ao fazer grandes operações de R/W em discos externos
[*] Quando você escreve diretamente em um nó de dispositivo de bloco , o Linux sincroniza o dispositivo de bloco quando ele é fechado (e não é aberto por nenhum outro programa). Consulte: Bloquear o cache do dispositivo versus um sistema de arquivos . Às vezes vejo pessoas que não usam uma sincronização explícita ao gravar em um dispositivo de bloco. Muitas vezes parecerá funcionar bem... até que não funcione. Então eu recomendo pelo menos usar
conv=fsync
.