Cache NFS: contenuto del file non aggiornato sul client quando modificato sul server


11

Ecco la mia configurazione: una macchina server NFS (v4), diverse macchine client NFS.

Quando una macchina client scrive file sul mount NFS, gli altri client vedono immediatamente il nuovo contenuto: nessun problema.

Ma, quando la macchina server modifica il contenuto del file, questo nuovo contenuto non viene mostrato sul client fino a quando non eseguo una lsdelle directory dal client.

Sono assolutamente sconcertato da questa incoerenza ... qualsiasi aiuto sarebbe molto apprezzato!

Informazioni:

  • nfs 1.2.3-r1 sia su client che su server
  • acregmin, acregmax, acdirmin, acdirmax, lookupcache: valori predefiniti

1
Puoi fare un piccolo esperimento per maggiori informazioni ?: Fai qualcosa ls -isul client prima di modificare il file sul server, poi di nuovo. Vedi se i numeri cambiano. Se lo fanno perché il server sta sostituendo il file e il client non se ne accorge fino a quando non ripristina la directory. In tal caso, provare a impostare l'opzione mount lookupcache=nonee vedere se il comportamento cambia.
Patrick,

2
scusa per il ritardo. L'inode cambia in modo efficace. Ho aggiunto l'opzione lookupcache, sembra funzionare. Controllerò di nuovo domani.
numberxiii,

Risposte:


11

Aggiunta come risposta in base al tuo commento.
La soluzione è aggiungere lookupcache=nonealle opzioni di mount di nfs.

Quello che succede è che la prima volta che il tuo client legge il file esegue una ricerca NFS per ottenere il fileid NFS. Quindi memorizza nella cache il fileid NFS e, quando torni ad aprire il file, utilizza la cache. Normalmente questo non è un problema poiché quando il file viene aggiornato il suo fileid rimane lo stesso. Ma per qualche motivo il vecchio file viene rimosso e ne viene creato uno nuovo (o rinominato o qualcosa in cui non è lo stesso file).
Ora normalmente questo non è un problema, come quando il tuo client tenta di aprire un fileid che non è presente, riceverà un errore dal server e farà un'altra ricerca per ottenere il nuovo fileid. Ma per qualche ragione il server NFS sta permettendo al client di aprire quel vecchio fileid. Forse un altro client ha il file aperto e quindi non è stato ancora cancellato, non lo so.

In ogni caso, il modo per risolverlo è dire al client di fare sempre un nfslookup prima di aprire un file usando l'opzione nfs mount lookupcache=none. Il rovescio della medaglia a questo è che può essere costoso se si aprono frequentemente file poiché aggiunge più traffico al server NFS.


Grazie per la tua spiegazione. Sul server NFS, lo stack della directory esportata è DRBD / LVM / ext4. Può essere che sta causando il "bug". Ho il problema su diversi client, ma non su altri ... Ripeterò tutti i miei test e ti dirò se tutto va bene con questa opzione.
numberxiii,

0

Cambia l'opzione mount in hard,intr. penso che l'impostazione predefinita potrebbe essere debole nel tuo sistema. questo aiuterà.


sfortunatamente, l'aggiunta di queste opzioni di montaggio non ha cambiato nulla :(
numberxiii

Per il mio primo test, faccio un rimontaggio. Poi ho fatto un test da un altro client, con un mount pulito. Il problema sembra essere corretto: aspettiamo 30
secondi

Ho creato un nuovo client (vm) per verificare: nessun problema con il contenuto!
numberxiii,

1
@ johnshen64 perché pensi che sarebbe difficile risolvere il problema? Hard / soft importa solo quando si tratta di interrompere la connessione, non ha nulla a che fare con la memorizzazione nella cache.
Patrick,

0

È inoltre possibile aggiornare manualmente la cache NFS con

sudo mount /nfs-mount -o remount

... nel caso in cui non si desideri aggiungere alcuna opzione di montaggio che comprometta le prestazioni.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.