Estou com dificuldade em entender isso.
Minha configuração de teste tem um script de shell chamando continuamente 'ls -la' em um arquivo 1G e imprimindo o tempo desde a última vez que ele foi executado. Eu então executo um programa para modificar partes do arquivo e sincronizá-lo com o disco.
Não importa se eu chamo o fsync, ou o sistema faz uma sincronização, ou mesmo se eu uso o pwrite para escrever as partes diferentes (ainda testando esse bit), quando a sincronização acontece o 'ls -la' irá congelar durante todo o tempo da sincronização - entre 7-40 segundos (dependendo da dispersão das modificações).
Se eu usar o msync para sincronizar partes de uma vez, ou tentar fsync com mais frequência enquanto escrevo, a duração será muito maior (talvez 10x o tempo, mas ainda mais dependendo da frequência com que o faço). A msync acima apenas grava em 16KB / Transaction, mesmo que as páginas sejam sequenciais.
Eu li em algum lugar que o OpenBSD implementou 'gravações parciais de arquivos' ou algo assim. Eu não consigo lembrar agora.
Existe alguma maneira que eu possa fazer algo similar com a eficiência do fsync sem que os arquivos sejam bloqueados o tempo todo?
Na verdade, o problema 'A' (para o qual eu acho que 'B' é a solução) é simplesmente trabalhar com arquivos grandes e 'incentivá-los' a serem gravados em disco para que a memória possa ser liberada rapidamente se precisa ser. Simplesmente omitir NO_SYNC não é bom, pois as mudanças ocorrerão quase ao mesmo tempo, causando esta situação. Nenhuma das outras opções de tratamento parece ajudar também. Ou seja, se eu não sincronizar, as páginas parecem ficar em volta até que eu fique sem memória, onde de repente elas começarão a trocar (embora apenas 16KB / Transaction e um MB / s muito baixo).
Como você trabalha com arquivos grandes no FreeBSD?
SOLUÇÃO:
Descobri que, ajustando meus fragmentos do msync e usando o MS_ASYNC em vez do MS_SYNC na chamada do msync, posso obter o desempenho que quero, enquanto ainda permitindo que outros processos abram e mmap / leiam o arquivo.