OK, aqui está minha resposta.
Relacionado ao link com o kernel 2.6.18 e 2.6.32 como enviado com o RedHat Não é hora de revalidar isso com novos kernels), em um cliente NFS (opções de montagem v3 / tcp / default), quando um está gravando em um arquivo, o kernel também precisa atualizar os timestamps deste arquivo. Enquanto o arquivo está sendo gravado, se outro processo desejar os metadados desse arquivo (como quando faz um stat
neste arquivo ou ls -l
em seu diretório pai), esse processo de leitura é atrasado pelo kernel até que a gravação seja terminou.
No nível do NFS, vejo que o kernel emitirá a chamada GETATTR
somente depois de tudo (não tenho certeza disso, mas nos meus testes até 5GiB, o tempo stat
pareceu corresponder ao dd
time) o WRITE
. Quanto maior a gravação, maior é a espera.
Com um servidor NFS lento ou um servidor com muita RAM, esse atraso pode ser de minutos. Quando o stat(2)
é colocado em suspensão, pode-se monitorar /proc/meminfo
para NFS_Unstable
ou Writeback
, o que mostra a quantidade de dados em vôo.
Não sei por que o kernel faz isso, mas pelo menos agora eu entendo o comportamento. Portanto, não há bufferbloat, mas algumas operações são serializadas.