Almacenamiento en caché / precarga de archivos en Linux en RAM


74

Tengo un servidor bastante antiguo que tiene 4 GB de RAM y está sirviendo prácticamente los mismos archivos todo el día, pero lo hace desde el disco duro, mientras que los 3 GB de RAM son "gratuitos".

Cualquiera que haya intentado ejecutar una memoria RAM puede ser testigo de que es increíble en términos de velocidad. El uso de memoria de este sistema generalmente nunca es superior a 1 GB / 4 GB, así que quiero saber si hay una manera de usar esa memoria adicional para algo bueno.

  • ¿Es posible decirle al sistema de archivos que siempre sirva ciertos archivos fuera de RAM?
  • ¿Hay algún otro método que pueda usar para mejorar las capacidades de lectura de archivos mediante el uso de RAM?

Más específicamente, no estoy buscando un 'hack' aquí. Quiero que las llamadas al sistema de archivos sirvan los archivos desde la RAM sin necesidad de crear una unidad de memoria ram y copiar los archivos allí manualmente. O al menos un guión que hace esto por mí.

Las posibles aplicaciones aquí son:

  • Servidores web con archivos estáticos que se leen mucho
  • Servidores de aplicaciones con grandes bibliotecas.
  • Computadoras de escritorio con demasiada RAM

¿Algunas ideas?

Editar:

  • Encontré esto muy informativo: el caché de página de Linux y pdflush
  • Como señaló Zan, la memoria no es realmente libre. Lo que quiero decir es que las aplicaciones no lo usan y quiero controlar lo que se debe almacenar en la memoria caché.

1
Yo también estoy buscando algo en este sentido. No creo que el almacenamiento en caché general del bloque de disco del sistema de archivos sea la respuesta. Supongamos que quiero que el bloque de disco X siempre se almacene en caché. Algo accede a él y el núcleo lo almacena en caché. Hasta ahora todo bien, pero el siguiente proceso quiere el bloque Y, por lo que el núcleo descarta mi bloque X y almacena en caché Y en su lugar. El siguiente proceso que quiere X tendrá que esperar a que salga del disco; eso es lo que quiero evitar. Lo que me gustaría (y lo que creo que el cartel original es después también) es superponer una caché de escritura simultánea en un sistema de archivos que garantice que los archivos están siempre

1
Dado que el consenso parece ser que Linux ya debería estar almacenando en caché los archivos de uso frecuente para usted, me pregunto si realmente logró hacer alguna mejora utilizando los consejos que se encuentran aquí. Me parece que tratar de controlar manualmente el almacenamiento en caché podría ser útil para calentar el caché, pero que con el patrón de uso que describe ("servir los mismos archivos todo el día"), no ayudaría a un servidor ya calentado mucho, si acaso.
Nate CK

Dices que no estás buscando un hack, pero Linux ya hace lo que quieres hacer de forma predeterminada. La siguiente ecuación: "servir los mismos archivos todo el día" + "le dice al sistema de archivos que siempre sirva ciertos archivos fuera de la RAM" es igual a "Hack" por definición. ¿Notó realmente alguna mejora en el rendimiento? Según mi experiencia, el caché de Linux es el bejeezus de las lecturas de su sistema de archivos.
Mike S

2
Para aclarar, Linux hace archivos en caché, pero los metadatos se validan para cada archivo para cada solicitud. Al oxidarse, en un servidor web ocupado con muchos archivos pequeños, eso todavía puede causar contención de E / S y desgastar prematuramente las unidades. El contenido estático y los scripts pueden ser rsync en / dev / shm o un montaje tmpfs personalizado al iniciar la aplicación. Lo he hecho durante un par de décadas y mis discos no se desgastan prematuramente. Además, mis sitios soportan mucho mejor la carga de estallido mucho mejor. Esto ayuda en cualquier cosa, desde el hardware empresarial más caro hasta el hardware commododity.
Aaron

Respuestas:


57

vmtouch parece una buena herramienta para el trabajo.

Reflejos:

  • preguntar cuánto de un directorio está en caché
  • preguntar qué cantidad de un archivo se almacena en caché (también qué páginas, representación gráfica)
  • cargar archivo en caché
  • eliminar el archivo de la caché
  • bloquear archivos en caché
  • correr como demonio

manual de vmtouch

EDITAR: El uso como se hizo en la pregunta aparece en el ejemplo 5 en vmtouch Hompage

Example 5

Daemonise and lock all files in a directory into physical memory:

vmtouch -dl /var/www/htdocs/critical/

EDIT2: Como se señaló en los comentarios, ahora hay un repositorio git disponible.


55
Para futuros espectadores, intente utilizar el repositorio vmtouch git en lugar de seguir las instrucciones en la página vinculada. De esa manera obtienes un archivo MAKE y puedes obtener actualizaciones.
azar el

Parece que hay un límite para el tamaño del archivo (4 GB). ¿Hay otra alternativa?
Alix Axel

Ok, aquí está mi caso de uso real: un RPi1 con una tarjeta SD vieja, en algún lugar haciendo cosas. Antes de hacer un viaje allí y reemplazar la tarjeta (y posiblemente la fuente de alimentación), quiero que el sistema operativo toque la tarjeta con moderación, preferiblemente nunca. El caché FS es bueno pero está más allá de mi control; / bin y / sbin ya están en tmpfs, por lo que obtener / home / user también tiene otros inconvenientes. vmtouchSe adapta bien a este nicho.
Piskvor

¿Cómo funciona vmtouch de manera diferente a tmpfs?
Edward Torvalds

26

Esto también es posible usar el vmtouch Toucher memoria virtual utilidad .

La herramienta le permite controlar el caché del sistema de archivos en un sistema Linux. Puede forzar o bloquear un archivo o directorio específico en el subsistema de caché de VM, o usarlo para verificar qué partes de un archivo / directorio están contenidas dentro de VM.

How much of the /bin/ directory is currently in cache?

$ vmtouch /bin/
           Files: 92
     Directories: 1
  Resident Pages: 348/1307  1M/5M  26.6%
         Elapsed: 0.003426 seconds

O...

Let's bring the rest of big-dataset.txt into memory...

$ vmtouch -vt big-dataset.txt
big-dataset.txt
[OOo                                                 oOOOOOOO] 6887/42116
[OOOOOOOOo                                           oOOOOOOO] 10631/42116
[OOOOOOOOOOOOOOo                                     oOOOOOOO] 15351/42116
[OOOOOOOOOOOOOOOOOOOOOo                              oOOOOOOO] 19719/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOo                        oOOOOOOO] 24183/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo                  oOOOOOOO] 28615/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo              oOOOOOOO] 31415/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo      oOOOOOOO] 36775/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo  oOOOOOOO] 39431/42116
[OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO] 42116/42116

           Files: 1
     Directories: 0
   Touched Pages: 42116 (164M)
         Elapsed: 12.107 seconds

3
Esta es una gran utilidad y hace exactamente lo que OP solicitó. Si tan solo aceptara esto como respuesta.
laebshade

¿Sabes si esto funciona con ZFS?
CMCDragonkai

1
@CMCDragonkai No creo que sea necesario con ZFS ... Piensa: ARC y L2ARC .
ewwhite

22

El truco de un pobre hombre para introducir cosas en el caché del sistema de archivos es simplemente atraparlo y redirigirlo a / dev / null.


1
De acuerdo. Y si usted quiere asegurarse de ciertos archivos se almacenan en caché, realizar una tarea programada, que cates el archivo a / dev / null periódicamente
Josh

18

Linux almacenará en caché la mayor cantidad de E / S de disco que pueda. Esto es lo que son las estadísticas de memoria caché y memoria intermedia. Probablemente hará un mejor trabajo que usted para almacenar las cosas correctas.

Sin embargo, si insiste en almacenar sus datos en la memoria, puede crear una unidad ram usando tmpfs o ramfs. La diferencia es que ramfs asignará toda la memoria que solicite, ya que tmpfs solo usará la memoria que está utilizando su dispositivo de bloque. Mi memoria está un poco oxidada, pero deberías poder hacer:

 # mount -t ramfs ram /mnt/ram 

o

 # mount -t tmpfs tmp /mnt/tmp

y luego copie sus datos al directorio. Obviamente, cuando apaga la máquina o desmonta esa partición, sus datos se perderán.


1
Gracias por su respuesta, pero esto es obviamente lo que quiero evitar. De lo contrario, simplemente lo escribiría para que la computadora creara la memoria RAM, copie los archivos y se vincule simbólicamente a la memoria RAM. Pero entonces mis datos son inconsistentes. Esperaba un sistema de archivos donde pueda 'etiquetar' ciertos archivos para almacenarlos en la memoria caché. Pero tal vez soy un poco demasiado optimista.
Andrioid

3
Usted "etiqueta" los archivos a almacenar en caché accediendo a ellos.
womble

9
Si solo hubiera alguna forma de etiquetar automáticamente los archivos más utilizados.
David Pashley

44
Blimey, el sarcasmo no viaja bien ¿verdad :)
David Pashley

2
Si, gracias. Entiendo el concepto de almacenamiento en caché de IO. Incluso lo expliqué en mi respuesta. Parece que no leíste el sutil comentario de que era sarcasmo.
David Pashley

18

Después de una extensa lectura sobre las características de intercambio de kernel 2.6 y almacenamiento en caché de páginas, encontré 'fcoretools'. Que consta de dos herramientas;

  • Fincore: revelará cuántas páginas ha almacenado la aplicación en la memoria central
  • fadvise: le permite manipular la memoria central (caché de página).

(En caso de que alguien más encuentre esto interesante, estoy publicando esto aquí)


1
Pensé que había un programa para hacer eso en alguna parte. +1
Brad Gilbert

7

Hay dos configuraciones de kernel que pueden ayudar considerablemente, incluso sin usar otras herramientas:

intercambio

le dice a linux kernel cuán agresivamente debería usar swap. Citando el artículo de Wikipedia:

Swappiness es una propiedad del kernel de Linux que cambia el equilibrio entre intercambiar memoria de tiempo de ejecución, en lugar de soltar páginas del caché de páginas del sistema. El intercambio se puede establecer en valores entre 0 y 100 inclusive. Un valor bajo significa que el núcleo intentará evitar el intercambio tanto como sea posible donde un valor más alto en su lugar hará que el núcleo intente agresivamente usar el espacio de intercambio. El valor predeterminado es 60, y para la mayoría de los sistemas de escritorio, establecerlo en 100 puede afectar el rendimiento general, mientras que establecerlo más bajo (incluso 0) puede mejorar la interactividad (disminuyendo la latencia de respuesta).

vfs_cache_pressure

Citando de vm.txt :

Controla la tendencia del kernel a recuperar la memoria que se utiliza para almacenar en caché los objetos de directorio e inodo.

Con el valor predeterminado de vfs_cache_pressure = 100, el núcleo intentará reclamar dentries e inodes a una tasa "justa" con respecto a pagecache y swapcache reclaman. La disminución de vfs_cache_pressure hace que el kernel prefiera retener caché de dentry e inode. ...


Al establecer swappinesshigh (como 100), el kernel mueve todo lo que no necesita intercambiar, liberando RAM para almacenar en caché los archivos. Y al establecer vfs_cache_pressureun valor más bajo (¡digamos a 50, no a 0!), Favorecerá el almacenamiento en caché de archivos en lugar de mantener los datos de la aplicación en la RAM.

(Trabajo en un gran proyecto Java y cada vez que lo ejecuto, tomó mucha RAM y enjuagué el caché del disco, así que la próxima vez que compilé el proyecto todo se volvió a leer desde el disco. Al ajustar estas dos configuraciones, administro para mantener las fuentes y la salida compilada en caché en RAM, lo que acelera el proceso considerablemente).


3

Dudo mucho que en realidad esté sirviendo archivos del disco con 3 GB de RAM libre. El almacenamiento en caché de archivos de Linux es muy bueno.

Si está viendo IO de disco, buscaría en sus configuraciones de registro. Muchos registros se configuran como no almacenados, para garantizar que la información de registro más reciente esté disponible en caso de bloqueo. Independientemente de los sistemas que deban ser rápidos, use el registro de E / S con buffer o use un servidor de registro remoto.


Correcto, solo quiero controlar lo que se está almacenando en caché.
Andrioid

3

Si tiene mucha memoria, simplemente puede leer los archivos que desea almacenar en caché con cat o similar. Linux hará un buen trabajo para mantenerlo.


3

Es posible que pueda tener un programa que solo mmapcontenga sus archivos y luego permanezca ejecutándose.


3
Eso es más o menos lo que hace 'fadvise' (fcoretools), por lo que puedo decir.
Andrioid

0

Hay varios sistemas ramfs que puede usar (por ejemplo, ramfs, tmpfs), pero en general, si los archivos se leen con tanta frecuencia, se almacenan en la memoria caché del sistema de archivos. Si su conjunto de archivos de trabajo es más grande que su ram libre, entonces los archivos se borrarán de él, pero si su conjunto de trabajo es más grande que su ram libre, tampoco hay forma de que lo coloque todo en un disco RAM.

Verifique la salida del comando "libre" en un shell: el valor en la última columna, en "En caché", es la cantidad de ram libre que se está utilizando para la memoria caché del sistema de archivos.


0

En cuanto a su última pregunta, asegúrese de que su RAM se encuentre en diferentes canales de memoria para que el procesador pueda obtener los datos en paralelo.


0

Creo que esto podría resolverse mejor a nivel de aplicación. Por ejemplo, probablemente haya servidores web especializados para esto, o podría considerar mod_cache con Apache. Si tiene un objetivo específico, como servir contenido web más rápido, puede obtener mejoras de este tipo de cosas, creo.

Pero su pregunta es de naturaleza general, el subsistema de memoria de Linux está diseñado para proporcionar el mejor uso general de RAM. Si desea apuntar a ciertos tipos de rendimiento, considere buscar todo en / proc / sys / vm.

El paquete fcoretools es interesante, me interesaría cualquier artículo sobre su aplicación ... Este enlace habla sobre las llamadas reales al sistema utilizadas en una aplicación.


1
encontrar / var / lib / mysql | xargs fadvise -willneed (sucio, pero debería proporcionar un acceso más rápido a los archivos de la base de datos; como ejemplo)
Andrioid el

Hack muy bueno, pero tal hack no desactiva muchos fsyncs en espera de mysql :( se necesitan fsyncs para garantizar ACID (Atomicidad, Consistencia, Aislamiento, Durabilidad).
osgx

0

Las computadoras de escritorio (por ejemplo, ubuntu) ya utilizan archivos de precarga (al menos, bibliotecas compartidas populares) para la memoria en el arranque. Se utiliza para acelerar el tiempo de arranque y arranque de diferentes bloarware como FF, OO, KDE y GNOME (con evolution bloat-mailer).

La herramienta se llama readahead http://packages.ubuntu.com/dapper/admin/readahead

También hay syscall correspondiente: readahead (2) http://linux.die.net/man/2/readahead

También hay un proyecto de precarga de daemon: http://linux.die.net/man/8/preload



0

acabo de probar dd if = / dev / yourrootpartition of = / dev / null \ bs = 1Mcount = howmuchmemoryyouwanttofill

no me da el control que deseas, pero al menos intenta usar memoria desperdiciada



0

No es exactamente lo que se pidió, pero yo uso

encuentre BASE_DIRECTORY -type f -exec cat {}> / dev / null \;

para activar la inicialización de archivos en un volumen de AWS creado a partir de una instantánea. Está más enfocado que la recomendación oficial de usar dd si solo desea leer algunos archivos.


-1

A veces es posible que desee almacenar en caché los archivos en una carpeta determinada y sus subcarpetas. Solo voy a esta carpeta y ejecuto lo siguiente:

encontrar . -exec cp {} / dev / null \;

Y esos archivos están en caché

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.