Come configurare Linux per memorizzare nella cache i metadati dei file rispetto ai contenuti?


14

Vorrei impostare il sistema in modo da utilizzare la maggior parte della RAM per la memorizzazione nella cache dei metadati del file system, ma solo una quantità ragionevolmente piccola per la memorizzazione nella cache di lettura / scrittura e il prefetch dei file. Idealmente, vorrei essere in grado di sfogliare il filesystem (tanto quanto si adatta alla RAM) senza far girare i dischi fino a quando non apro effettivamente un file.

Ecco i dettagli:

Ho un file server fatto in casa. Ha cinque dischi in un volume LVM intorno a 9 TB, ma solo 4 GB di RAM. Poiché il server non fa molto altro che servire i file, la maggior parte della RAM viene utilizzata per la memorizzazione nella cache. (Rapporti "gratuiti" 3,4 G su 3,9 G utilizzati per la cache.)

Il server vive nella mia camera da letto e se tutti i dischi girano, fa abbastanza rumore da essere fastidioso quando è silenzioso. (Non intendo cercare il rumore, solo il rumore di rotazione. I dischi sono di varie marche e modelli, e penso che lievi differenze nelle velocità di rotazione causino interferenze. Nessun disco è rumoroso da solo, ma se alcuni di essi ruotano insieme c'è un leggero rumore con un periodo sotto Hertz.) Quindi ho configurato il server per far girare i dischi per la maggior parte del tempo.

Naturalmente, se i dischi vengono spenti quando apro una cartella nel mio file manager, c'è un ritardo mentre qualunque dei dischi ha quella cartella si gira. Solo che non è un grosso problema. Ma a seconda di dove guardo, può succedere più volte di seguito, se LVM diffonde i metadati per ogni sottocartella sui diversi dischi.

Ho il sospetto che Linux riempia principalmente la sua cache con contenuti di file e possibilmente dati precaricati. La memorizzazione nella cache non è molto utile oltre alcuni MB per garantire una riproduzione fluida; se ho appena visto un film, probabilmente non lo rivedrò presto. Il prefetch, se succede, è anche completamente inutile nel mio caso , dopo più di qualche MB.

Ma si potrebbe pensare che 4 GB dovrebbero essere sufficienti per poter memorizzare nella cache la maggior parte dei metadati del file system, almeno quelle parti che sono già state visitate, in modo che io possa sfogliare i file senza bisogno di far girare i dischi se si scopre che sono dormire.

Ci sarebbe ancora un ritardo all'apertura del file, ma va bene. Confronta "clic; aspetta ; clic; aspetta ; clic; aspetta ; giocare; guarda "con" clic; clic; clic; giocare; aspetta ; orologio". Il primo è incredibilmente frustrante; quest'ultimo è quasi previsto.

Appunti:

  1. Se è importante, il kernel è 3.2, il sistema operativo è Debian, il volume è lvm2 e FS è ext4.

  2. L'unica ragione per lo spin down è il rumore durante la notte; altrimenti il ​​server funziona continuamente. (L'ho reso a bassa potenza quanto ragionevole.) Il ritardo di spin-down varia a seconda dell'ora del giorno.

  3. I dischi rigidi sono solo per supporti. Il sistema operativo si trova su un'unità flash (piccola) separata. (Il che significa che i ritardi di spin-up provengono dai dati, non solo perché avevano bisogno di qualcosa /usro qualcosa del genere. Potrei risparmiare qualche GB su di esso se in qualche modo potesse aiutare con il mio problema.

  4. Un impatto ragionevole sulle prestazioni non è un grosso problema. I dischi sono comunque più veloci della mia rete.

Risposte:


10

Per controllare come Linux memorizza nella cache le cose si riferiscono a questo https://www.kernel.org/doc/Documentation/sysctl/vm.txt

In particolare vfs_cache_pressure, probabilmente vuoi un valore molto basso o forse anche zero (1 mi sembra un po 'più sicuro):

vfs_cache_pressure
------------------

Controls the tendency of the kernel to reclaim the memory which is used for
caching of directory and inode objects.

At the default value of vfs_cache_pressure=100 the kernel will attempt to
reclaim dentries and inodes at a "fair" rate with respect to pagecache and
swapcache reclaim.  Decreasing vfs_cache_pressure causes the kernel to prefer
to retain dentry and inode caches. When vfs_cache_pressure=0, the kernel will
never reclaim dentries and inodes due to memory pressure and this can easily
lead to out-of-memory conditions. Increasing vfs_cache_pressure beyond 100
causes the kernel to prefer to reclaim dentries and inodes.

Inoltre, potresti voler modificare in swappinessmodo da non scambiare mai i dati o farlo in modo che accada solo in casi estremi.

L' drop_cachesopzione potrebbe essere utile per eliminare esplicitamente i dati che non si desidera più memorizzati nella cache.

Sono sicuro che ci sono probabilmente altre opzioni che potrebbero aiutare, quindi rivedi la documentazione del kernel.

Per applicarli metterei le impostazioni che vuoi cambiare /etc/sysctl.confo qualunque cosa il tuo sistema operativo debba ripristinarle all'avvio.


3
Buon post, ma vorresti scambiare il più possibile dato l'obiettivo dell'OP. Lo scambio colpisce solo la memoria dell'utente, quindi aumentando la sua tendenza a passare al disco, si lascia più memoria fisica per occupare le cache. L'aumento della swap consente di liberare memoria, ma può rallentare le applicazioni se è aumentato troppo (determinare che il punto debole è fondamentalmente un'accoglienza iterativa)
Bratchley,

Ciao Kyle, grazie per l'idea. vfs_cache_pressure funziona in qualche modo, ma non è abbastanza. Ecco cosa ho fatto:
bogdanb

Quando imposto vcp su 0, se faccio un find / -ls > /dev/null, quindi abbasso i dischi, quindi di nuovo findtutti i file, i dischi non si girano. freemostra i buffer che salgono a circa 202 MB mentre lo fanno. Ma, se faccio il find, quindi cat /file/bigger/than/ram > /dev/null, freemostra che si sta cachedalzando per riempire lo spazio vuoto, e per qualche ragione buffersscende a circa 195 MB. Quindi se giro i dischi e faccio di findnuovo i dischi continuano a girare :-(
bogdanb,

Informazioni swappiness: è impostato sul valore predefinito di 60, ma la macchina non ha alcuna partizione di swap, quindi non sono sicuro che faccia molto. Immagino di poter mettere un file di scambio sull'unità flash, ma non ho idea di come possa aiutare o come ridimensionarlo.
bogdanb,

1
Linux sta cercando di essere furbo riguardo alla memorizzazione nella cache. Non sono sicuro che l'impostazione vfs = 0 funzionerà come previsto. Penso che proverebbe a recuperare quelle altre voci quando la pressione dalle applicazioni (cioè malloc ()) richiede più memoria. Per quanto riguarda un modo per dire a Linux di non usare più di 2 GB per le cache, non sono a conoscenza di una cosa del genere. Nella maggior parte dei casi sprecherebbe RAM. Un'altra cosa che potresti voler guardare è la "modalità laptop" che tenta di fare le cose in modo diverso per mantenere i dischi sparsi per i laptop. Non l'ho usato però, quindi non ne so molto.
Kyle,
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.