¿Cómo configurar Linux para almacenar en caché los metadatos del archivo con preferencia al contenido?

14

Me gustaría configurar el sistema para usar la mayoría de la RAM para el almacenamiento en caché de metadatos del sistema de archivos, pero solo una cantidad razonablemente pequeña para el almacenamiento en caché de lectura / escritura y la captación previa de archivos. Idealmente, me gustaría poder navegar por el sistema de archivos (tanto como cabe en la RAM) sin girar los discos hasta que realmente abra un archivo.

Aquí están los detalles:

Tengo un servidor de archivos casero. Tiene cinco discos en un volumen LVM de alrededor de 9 TB, pero solo 4 GB de RAM. Como el servidor no hace mucho más que servir archivos, la mayor parte de la RAM se usa para el almacenamiento en caché. ("Gratis" informa 3.4G de 3.9G usado para caché).

El servidor vive en mi habitación, y si todos los discos están girando, hace suficiente ruido para ser molesto cuando está en silencio. (No me refiero a buscar ruido, solo ruido de giro. Los discos son de varias marcas y modelos, y creo que pequeñas diferencias en las velocidades de rotación causan interferencia. Ningún disco es ruidoso por sí solo, pero si algunos de ellos están girando juntos, hay un ligero ruido con un período de menos de Hertz.) Así que configuré el servidor para girar los discos la mayor parte del tiempo.

Por supuesto, si los discos se vuelven hacia abajo cuando abro una carpeta en mi administrador de archivos, hay una demora mientras cualquiera de los discos tiene esa carpeta gira. Solo que no es gran cosa. Pero dependiendo de dónde mire, puede suceder varias veces seguidas, si LVM extendió los metadatos para cada subcarpeta en los diferentes discos.

Sospecho que Linux en su mayoría llena su caché con contenido de archivos y posiblemente con datos previamente capturados. El almacenamiento en caché no es muy útil más allá de unos pocos MB para garantizar una reproducción fluida; Si acabo de ver una película, probablemente no la volveré a ver pronto. La captación previa, si sucede, también es completamente inútil en mi caso , después de más de unos pocos MB.

Pero uno pensaría que 4GB deberían ser suficientes para poder almacenar en caché la mayoría de los metadatos del sistema de archivos, al menos las partes que ya se visitaron, para poder examinar los archivos sin necesidad de girar los discos si resulta que son dormido.

Todavía habría un retraso al abrir el archivo, pero está bien. Comparar "clic; espere ; hacer clic; espere ; hacer clic; espere ; jugar; mirar "con" clic; hacer clic; hacer clic; jugar; espere ; reloj". El primero es increíblemente frustrante; este último es casi esperado.

Notas:

  1. Si importa, el núcleo es 3.2, el sistema operativo es Debian, el volumen es lvm2 y el FS es ext4.

  2. La única razón del descenso es el ruido durante la noche; de lo contrario, el servidor se ejecuta continuamente. (Lo hice con tan poca potencia como sea razonable). El retraso de la rotación varía según la hora del día.

  3. Los discos duros son solo para medios. El sistema operativo está en una unidad flash (pequeña) separada. (Lo que significa que cualquier retraso en la rotación proviene de los datos, no solo porque necesitaba algo /usro lo que sea. Podría ahorrarle unos pocos GB si pudiera ayudar con mi problema de alguna manera.

  4. Un impacto razonable en el rendimiento no es gran cosa. Los discos son más rápidos que mi red de todos modos.

bogdanb
fuente

Respuestas:

10

Para controlar cómo las cosas de caché de Linux se refieren a este https://www.kernel.org/doc/Documentation/sysctl/vm.txt

En particular, mire vfs_cache_pressure, probablemente desee un valor realmente bajo o tal vez incluso cero (1 me parece un poco más seguro):

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.

También es posible que desee modificar swappinesspara que nunca intercambie datos o lo haga para que solo ocurra en casos extremos.

La drop_cachesopción puede ser útil para soltar explícitamente los datos que ya no desea almacenar en caché.

Estoy seguro de que probablemente haya otras opciones que puedan ayudar, así que revise la documentación del kernel.

Para aplicarlos, pondría la configuración que desea cambiar /etc/sysctl.confo lo que sea que tenga su sistema operativo para restaurarlos en el arranque.

Kyle
fuente
3
Buena publicación, pero desearía tanto intercambio como sea posible dado el objetivo del OP. El intercambio solo afecta la memoria del usuario, por lo que aumenta su tendencia a cambiar al disco y luego deja más memoria física para que las memorias caché ocupen. El aumento del intercambio libera memoria, pero puede ralentizar las aplicaciones si se incrementa demasiado (determinar el punto
óptimo
Hola Kyle, gracias por la idea. vfs_cache_pressure funciona, pero no es suficiente. Esto es lo que hice:
bogdanb
Cuando configuro vcp en 0, si hago un find / -ls > /dev/null, gire los discos, luego findtodos los archivos nuevamente, los discos no giran. freemuestra buffers que se elevan a unos 202MB al hacer esto. Pero, si hago el find, entonces cat /file/bigger/than/ram > /dev/null, freemuestra un cachedaumento para llenar el espacio vacío, y por alguna razón buffersbaja a unos 195 MB. Luego, si giro los discos y findvuelvo a hacerlo, los discos siguen girando :-(
bogdanb
Acerca de swappiness: está configurado en el valor predeterminado de 60, pero la máquina no tiene ninguna partición de intercambio, por lo que no estoy seguro de si tiene mucho. Supongo que podría poner un archivo de intercambio en la unidad flash, pero no tengo idea de cómo ayudaría o cómo dimensionarlo.
bogdanb
1
Linux está tratando de ser inteligente sobre el almacenamiento en caché. No estoy seguro de que configurar vfs = 0 funcione de la manera que espera. Creo que trataría de recuperar esas otras entradas cuando la presión de las aplicaciones (es decir, malloc ()) solicite más memoria. En cuanto a una forma de decirle a Linux que no use más de 2 GB para cachés, no estoy al tanto de tal cosa. Estaría desperdiciando RAM en la mayoría de los casos. Otra cosa que es posible que desee ver es el "modo portátil", que intenta hacer las cosas de manera diferente para mantener los discos girados hacia abajo para portátiles. Sin embargo, no lo he usado, así que no sé mucho al respecto.
Kyle