Sé que puedo eliminar todo del caché del sistema de archivos de Linux , pero ¿hay alguna manera de eliminar solo un archivo específico? ¿O evitar que un archivo se almacene en caché? ¿O le dice a un proceso que no guarde en caché los archivos que escribe?
Tengo un proceso que lee muchos archivos pequeños y escribe un archivo grande. Quiero mantener los pequeños archivos en caché para evitar búsquedas de disco, y no me importa almacenar en caché el archivo grande.
linux
files
filesystems
cache
Jay Hacker
fuente
fuente
Respuestas:
Método potencial n. ° 1: F_DROP_CACHES
Encontré un método de 2012 que analiza un parche propuesto para el kernel de Linux en este hilo de correo titulado: Re: [Parche RFC] fs: implementar cachés de caída por archivo .
extractoEl hilo incluye un caso de prueba y el parche real para varios archivos dentro del kernel de Linux que agrega una función adicional al
fs/drop_caches.c
llamadodrop_pagecache_file(struct file *filp)
. Esta función se puede acceder a través de la herramienta de interfaz, afnctl.c
través del comandoF_DROP_CACHES
. Este caso llama a esta función:Que maneja la caída de todos los cachés asociados con el archivo dado. Del archivo
¿Entonces esto se puede usar?include/linux/mm.h
:No encontré evidencia de que este parche haya llegado al repositorio principal de código del kernel de Linux, por lo que esta opción parece estar disponible, solo si está dispuesto a recompilar el kernel de Linux usted mismo.
Método potencial n. ° 2: uso de dd
En ese mismo hilo, otro usuario menciona una metodología completamente diferente que utiliza
Lo siguiente es un extracto de ese correo electrónico Probándolodd
.No era 100% positivo cómo probar esto, pero se me ocurrió el siguiente enfoque.
hacer un archivo de 100 MB
rastrear accesos a archivos usando
fatrace
ejecutar
top
para que podamos monitorear el uso de memoria, nota cantidad libre.Abra el archivo, observe la cantidad de memoria libre ahora. Tenga en cuenta la
fatrace
del archivosample.txt
.suelte el archivo de la memoria, observe la cantidad de memoria libre ahora. Tenga en cuenta la salida de
fatrace
.Ejemplo
En la terminal # 1: En la terminal # 2: En la terminal # 3: Ahora abra el archivo,sample.txt
y observe la cantidad de RAM. En la terminal # 1. En la terminal # 2: Observe la salida defatrace
en la terminal # 3: Ahora elimine el archivo de RAM, en la terminal # 4: Tenga en cuenta la salida defatrace
en la terminal # 2: Tenga en cuenta la RAM en la terminal # 3:Por lo tanto, parece que todo lo que consumió el archivo en RAM se libera.
Método potencial # 3 - python-fadvise
Gracias a un comentario de @frostchutz, hay otra herramienta, un script de Python,
Ejemplo[pyadvise][4]
que proporciona una interfaz mucho más simple que losdd
métodos anteriores . Este script hace uso de la mismaposix_fadvise(2)
interfaz.Y si repetimos la prueba anterior y la usamos
pyadvise
en lugar dedd
:Noté una caída idéntica en la RAM que se consumía como antes cuando la usaba
dd
.fuente
dd
funciona para mi. Terminé con chris-lamb.co.uk/projects/python-fadvise, que es lo mismo en un comando más obvio.python-fadvise
es mucho más fácil, agregué un ejemplo que muestradd
.os.posix_fadvise()
en el libray estándar de Python ahora.Expandiendo la respuesta de @ geekosaur puede forzar el uso
O_DIRECT
usando LD_PRELOAD y el programa aquí: http://arighi.blogspot.com/2007/04/how-to-bypass-buffer-cache-in-linux.htmlEse código obliga
O_DIRECT
a todos los archivos. Sin embargo, simplemente agregando algo más de lógica strncmp__do_wrap_open
puede aplicar selectivamente O_DIRECT.Descargo de responsabilidad: no he probado esto.
fuente
Puede abrir archivos individuales con el
O_DIRECT
indicador (verman 2 open
): lea la sección de NOTAS de esa página de manual cuidadosamente y considere si también desea / necesitaO_SYNC
.fuente
cat
, y prefiero no reescribirlo. :) Esperaba una herramienta de línea de comandos o una/proc/sys
perilla.open
bandera; de hecho, necesitarías escribir un programa para hacerlo. (cat -u
Sólo se desactivastdio
el almacenamiento en búfer, no OS búfer.)Si desea forzar a un archivo a usar siempre O_SYNC, puede marcarlo así en los atributos extendidos con
chattr +S $file
:hombre chattr:
O_SYNC obliga a que los datos + metadatos se escriban en los búferes de disco, pero aún pasa a través de la memoria caché de la página. O_DIRECT omite el caché de la página.
Pero tenga en cuenta que abrirlo con O_DIRECT sería perjudicial para el rendimiento, si el archivo grande que se está agregando, la diferencia podría ser pequeña. Pero si el archivo grande se ha reescrito en lugares aleatorios, O_DIRECT será un gran éxito en el rendimiento, incluso teniendo en cuenta que tenerlo en caché podría desalojar de la caché algunos de los pequeños archivos de lectura.
Si tiene el ram para mantener todos los archivos pequeños allí, podría abordar el problema de la otra manera. Asegúrate de que los archivos pequeños estén siempre en RAM, entonces sugeriría copiarlos en tmpfs :
fuente
chattr +S
no es lo mismo queO_DIRECT
, es lo mismo queO_SYNC
.O_DIRECT
hace que las lecturas no se almacenen en caché (de eso se trata esta pregunta) y las escrituras no se almacenan en el búfer, sin garantía.O_SYNC
hace que solo las escrituras no sean almacenadas.O_DIRECT
aO_SYNC
haría que su respuesta sea internamente consistente, pero aún así errónea teniendo en cuenta la pregunta.