Buscar / almacenamiento en caché

10

Parece que la primera vez que ejecuto findo lsen un directorio, lleva un tiempo trabajar. Pero, cada vez después, es rápido, como si una lista de los contenidos del directorio se hubiera almacenado o indexado en alguna parte.

¿Hay alguna manera de preservar este caché en los reinicios de la computadora?

Ricardo
fuente
1
De hecho está en caché. Linux usa memoria no utilizada como caché y búferes (esa es una razón por la que siempre debe tener algún intercambio, incluso con "suficiente" RAM). El comando libre le muestra cuánto está disponible. No estoy seguro de que tenga mucho sentido almacenar en caché entre reinicios, mucho puede cambiar entre las botas. ¿Qué tal hacer que un cron-job se ejecute con la menor prioridad cada 10,30 minutos, para simplemente revisar todos sus archivos? Debe mantener el caché relativamente actualizado en todo momento. También piense que hay una manera (para el núcleo) de detectar cambios en los archivos.
Baard Kopperud

Respuestas:

8

Puede usar vmtouch para agregar archivos a la caché de su página (caché de disco).

Ponga nohup vmtouch -dl <files or directories> &su /etc/rc.localarchivo para agregar y bloquear archivos en el caché de su página en el arranque. Si desea agregar archivos a la memoria caché de su página, pero no quiere bloquearlos en la memoria, use la -tbandera en lugar de las -ldbanderas.

Para obtener más información sobre el caché de la página, mire aquí , aquí y en wikipedia .

Comunidad
fuente
Ese comando no parece estar disponible en Ubuntu, ¿hay alguna alternativa que pueda probar?
Richard
@ Richard Es muy fácil compilar vmtouch usted mismo: instale el build-essentialpaquete. Descargar vmtouch.c. Ejecute gcc -O2 -o vmtouch vmtouch.co make vmtouchy obtendrá el binario vmtouchque luego puede copiar, por ejemplo, /usr/local/bino llamar ./vmotouch.
jofel
@ Richard No uso Ubuntu, así que no he probado esto y no me hago responsable, pero buscar en Google "Ubuntu mvtouch" trajo este ppa .
terdon
@jofel, sí, fue bastante fácil de compilar, gracias. Simplemente prefiero usar paquetes cuando sea posible.
Richard
@Evan, corrígeme si me equivoco, pero ¿no lo usaría vmtouchcomo un comando de inicio lento? Mi esperanza había sido preservar un caché en las botas en lugar de (costosamente) regenerarlo cada vez.
Richard
2

"Conservar a través de reinicios", lo dudo. Pero puede reconstruir trivialmente el caché al arrancar, lo que logra casi lo mismo menos un pequeño retraso.

Cree un archivo /etc/cron.d/rebuild-fs-cachey coloque lo siguiente en él:

@reboot root /usr/bin/nice -n 19 /usr/bin/ionice -c 3 -t /usr/bin/find / >/dev/null 2>&1

Esto usa nicey ionice(que debe instalarse de manera predeterminada y definitivamente debe estar disponible a través del administrador de paquetes; Debian los coloca coreutilsy util-linux, respectivamente) para reducir la prioridad del findproceso a los niveles más agradables posibles, lo que significa que no debería interferir con nada más ejecutándose en su sistema pero tardará un poco más en completarse. findpasará por sí mismo y stat()todo, lo que obliga al núcleo a cargar los datos del sistema de archivos desde el disco a la memoria.

Una vez que se ha creado el caché, siempre que no se elimine porque el sistema operativo necesita la memoria para otra cosa, debe mantenerse. He estado usando esto por un tiempo y las listas de directorios incluso en directorios grandes son significativamente más rápidas que sin el trabajo cron anterior, aunque no puedo citar ningún número exacto.

un CVn
fuente
1
Si va a reinventar la rueda, también podría usarla locate, que viene con la updatedbactualización de una base de datos de localización: en.wikipedia.org/wiki/Locate_(Unix)
laebshade
@laebshade No uso locateen absoluto, pero uso lsmucho. Y ocasionalmente find. (Además, find y ls son los comandos específicos sobre los que pregunta el OP). El punto de usar findaquí es que itera sobre todo en el almacenamiento llamando a stat (), por lo que el núcleo debe cargar los metadatos en la memoria. Una vez que está allí, es tan bueno como si estuviera almacenado en un reinicio.
un CVn