Existe um comando que forçará o Linux a liberar o cache de um arquivo em um compartilhamento NFS?

14

Relacionado a esta pergunta no StackOverflow , pergunto-me se existe uma maneira de liberar o cache do NFS / forçar o Linux a ver a cópia mais atualizada de um arquivo que esteja em um compartilhamento NFS.

Tenho uma situação em que quatro servidores Apache montam o mesmo diretório via NFS e, quando um servidor faz uma alteração em um arquivo, leva de 5 a 10 segundos para os outros servidores verem essa alteração. Se uma segunda alteração for feita nesse arquivo nessa janela, ela poderá substituir a primeira.

A fstabentrada para o sistema de arquivos é:

172.16.1.15:/home               /media/home     nfs     vers=3,defaults,noauto,sync,acregmin=1          0       0

Existe um comando que forçará o Linux a liberar o cache de um arquivo em um compartilhamento NFS?

Josh
fonte
Qual mecanismo de cache do apache você está usando?
usermane
@ usermane: Eu não estou usando um mecanismo de cache do Apache. Os arquivos em questão são arquivos PHP e, quando modificados em um host, os outros hosts não veem essa alteração por alguns segundos.
Josh

Respostas:

12

Verifique estes itens e veja se há algum trabalho para você:

  1. No cliente , se você ainda não estiver usando a ctoopção na coluna de opções da /etc/fstablinha do seu sistema de arquivos NFS, adicione-a. ctodiz ao cliente nfs para abrir arquivos via close-to-open, o que os faz atualizar o arquivo sempre que o abrem.

  2. No servidor , verifique se o seu sistema de arquivos foi exportado com a syncopção, e não async. Com gravações síncronas, o cliente liberará para o disco quando o arquivo for fechado. ( ou com a NFS V3, sempre que uma confirmação () é feita ). Pode haver um desempenho atingido dessa maneira, mas se você estiver gravando em um sistema de arquivos NFS, definitivamente deseja syncdefinir.

  3. Seguindo o post dessa stackoverflow, a abertura do arquivo com O_DIRECT funcionará apenas se o kernel tiver sido compilado com CONFIG_NFS_DIRECTIO.

  4. Além disso, verifique se você possui as seguintes configurações no seu arquivo httpd.conf:

    • EnableMMAP off
    • EnableSendfile off

    Na documentação de ajuste de desempenho do apache:

    • Se você mapear na memória um arquivo localizado em um sistema de arquivos montado em NFS e um processo em outra máquina cliente NFS excluir ou truncar o arquivo, seu processo poderá receber um erro de barramento na próxima vez que tentar acessar o conteúdo do arquivo mapeado.
    • Desativar o EnableSendfile não ajudará especificamente com o comportamento de sincronização / async do NFS, mas precisará ser desativado se você estiver usando o apache com o NFS.
Tim Kennedy
fonte
Obrigado! Essas são ótimas sugestões. Não estou usando ctono cliente e vou tentar isso. Eu não tenho syncnem asyncno servidor; Acabei de adicionar sync. O_DIRECTnão me ajudou, porque na verdade é o PHP que está lendo esses arquivos e não pode abri-los O_DIRECTda maneira que encontrar.
Josh
@ Josh, isso resolveu o seu problema? Estamos bloqueados no mesmo problema! Você poderia atualizar esta postagem?
Rafa.ferreira 28/08
3

Dentro de um determinado processo, chamar opendir e closedir no diretório pai de um arquivo invalida o cache do NFS. Eu usei isso ao programar um agendador de tarefas. Muito, muito útil. Tente!

Erik Aronesty
fonte
-1

Se você abrir o arquivo fornecido em um programa não armazenado em cache (como vim ou emacs) e depois fechar, ele atualizará / limpará o cache desse arquivo

Cameron Clarke
fonte
2
Qual é a sua definição de "programa não armazenado em cache" e você tem uma referência para essa declaração?
RalfFriedl