¿Hay algún comando que obligue a Linux a vaciar la memoria caché de un archivo en un recurso compartido NFS?

14

En relación con esta pregunta en StackOverflow , me pregunto si hay una manera de vaciar el caché NFS / forzar Linux para ver la copia más actualizada de un archivo que está en un recurso compartido NFS.

Tengo una situación en la que cuatro servidores Apache montan el mismo directorio a través de NFS, y cuando un servidor realiza un cambio en un archivo, los otros servidores tardan entre 5 y 10 segundos en ver ese cambio. Si se realiza un segundo cambio en ese archivo dentro de esta ventana, puede sobrescribir el primer cambio.

La fstabentrada para el sistema de archivos es:

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

¿Hay algún comando que obligue a Linux a vaciar la memoria caché de un archivo en un recurso compartido NFS?

Josh
fuente
¿Qué mecanismo de almacenamiento en caché de apache estás usando?
usermane
@usermane: no estoy usando un mecanismo de almacenamiento en caché de Apache. Los archivos en cuestión son archivos PHP, y cuando se modifican en un host, los otros hosts no ven ese cambio durante unos segundos.
Josh

Respuestas:

12

Verifique estos elementos y vea si alguno funciona para usted:

  1. En el cliente , si aún no está utilizando la ctoopción en la columna de opciones de la /etc/fstablínea para su sistema de archivos NFS, agréguela. ctole dice al cliente nfs que abra los archivos a través de close-to-open, lo que les hace actualizar el archivo cada vez que lo abren.

  2. En el servidor , asegúrese de que su sistema de archivos se exporte con la syncopción, y no async. Con escrituras sincrónicas, el cliente vaciará al disco cuando se cierre el archivo. ( o con nfs V3, cada vez que se realiza un commit () ). Puede haber un impacto en el rendimiento de esa manera, pero si está escribiendo en un sistema de archivos NFS, definitivamente quiere syncconfigurarlo.

  3. Siguiendo los pasos de esa publicación de stackoverflow, abrir el archivo con O_DIRECT funciona solo si el núcleo se compiló con CONFIG_NFS_DIRECTIO.

  4. Además, asegúrese de tener la siguiente configuración en su archivo httpd.conf:

    • EnableMMAP off
    • EnableSendfile off

    De la documentación de ajuste de rendimiento de apache:

    • Si asigna un archivo de memoria a un archivo ubicado en un sistema de archivos montado en NFS y un proceso en otra máquina cliente NFS elimina o trunca el archivo, su proceso puede recibir un error de bus la próxima vez que intente acceder al contenido del archivo asignado.
    • Desactivar EnableSendfile no ayudará específicamente con el comportamiento de sincronización / asíncrono de NFS, pero debe desactivarse si está utilizando apache con NFS.
Tim Kennedy
fuente
¡Gracias! Estas son excelentes sugerencias. No estoy usando ctoel cliente y lo intentaré. Yo tampoco tengo syncni asyncen el servidor; Acabo de agregar sync. O_DIRECTno me ayudó porque en realidad es PHP el que lee estos archivos y no puede abrirlos O_DIRECTde ninguna manera que pueda encontrar.
Josh
@ Josh, ¿resolvió tu problema? ¡Estamos bloqueados por el mismo problema! ¿Podrías actualizar esta publicación?
rafa.ferreira
3

Dentro de un proceso dado, llamar a opendir y closedir en el directorio padre de un archivo invalida el caché NFS. Usé esto mientras programaba un programador de trabajos. Muy, muy servicial. ¡Intentalo!

Erik Aronesty
fuente
-1

Si abre el archivo dado en un programa no almacenado en caché (como vim o emacs) y luego lo cierra, actualizará / borrará el caché para ese archivo

Cameron Clarke
fuente
2
¿Cuál es su definición de "programa no almacenado en caché", y tiene una referencia para esa declaración?
RalfFriedl