Devo executar um comando “sync” antes de medir os exatos tempos de IO?

0

Estou testando meu novo algoritmo em um processo baseado em disco. Para fins de comparação, é essencial medir o tempo exato que cada operação de leitura / gravação [massiva] tomou.

Parece que na VM do Linux com um HDD local, as operações reais de gravação em disco ainda estão em andamento / pendentes mesmo depois que o flush () é concluído (por exemplo, BufferedWriter.flush() em java). Esta conclusão é feita pela evidência de que:

  1. Quando executo sync ; sleep 60 ; sync , o segundo sync é feito em um piscar de olhos.
  2. Quando executo sync ; ./myProg ; sync , a segunda sincronização leva 40 segundos .

Por que a segunda sincronização leva tanto tempo? Eu pensei que o sistema operacional deve garantir a consistência quando o programa libera dados em arquivo, mas não parece ser verdade aqui. Por que o Linux faz um buffer tão arriscado em uma memória volátil?

É racional incluir o tempo para a sincronização como parte do tempo de gravação real? (no meu trabalho de pesquisa)?

    
por Ali 06.07.2017 / 13:45

1 resposta

1

Você confunde fflush() com os vários sabores de fsync() .

fflush() garante que o que estiver armazenado em buffer dentro de sua pilha de manipulação de arquivos seja passado para o SO para anotá-la.

fsync() garante que o sistema operacional grava os dados no armazenamento estável.

    
por 06.07.2017 / 13:48