2008-11-03 12 views
7

Tengo un servidor web que guarda los archivos de caché y los mantiene durante 7 días. Los nombres de archivo son hashes MD5, es decir, exactamente 32 caracteres hexadecimales de largo, y se mantienen en una estructura de árbol que se parece a esto:manejo de un montón de pequeños archivos temporales

00/ 
    00/ 
    00000ae9355e59a3d8a314a5470753d8 
    . 
    . 
00/ 
    01/ 

Usted consigue la idea.

Mi problema es que la eliminación de archivos antiguos está llevando mucho tiempo. Tengo un trabajo cron diario que ejecuta

find cache/ -mtime +7 -type f -delete 

que toma más de medio día completar. Me preocupa la escalabilidad y el efecto que esto tiene en el rendimiento del servidor. Además, el directorio de la memoria caché ahora es un agujero negro en mi sistema, atrapando a los ocasionales inocentes du o find.

La solución estándar para el caché LRU es una especie de montón. ¿Hay alguna manera de escalar esto al nivel del sistema de archivos? ¿Hay alguna otra forma de implementar esto de forma que sea más fácil de administrar?

Estas son las ideas que yo consideraba:

  1. Crear 7 directorios principales, uno para cada día de la semana y un directorio vacío todos los días. Esto aumenta el tiempo de búsqueda para un archivo de caché 7 veces, lo hace realmente complicado cuando se sobrescribe un archivo, y no estoy seguro de lo que hará con el tiempo de eliminación.
  2. Guarde los archivos como blobs en una tabla MySQL con índices de nombre y fecha. Esto parecía prometedor, pero en la práctica siempre ha sido mucho más lento que FS. Tal vez no lo estoy haciendo bien.

¿Alguna idea?

Respuesta

15

Cuando almacena un archivo, cree un enlace simbólico a una segunda estructura de directorios organizada por fecha, no por nombre.

Recupere sus archivos utilizando la estructura "nombre", elimínelos usando la estructura "fecha".

+0

Bugger :) Me ganaste. +1 esta respuesta. –

+0

Solo asegúrese de eliminar tanto el archivo original como el enlace. No querrás muchos enlaces muertos allí, y también es fácil eliminar el enlace y no eliminar el archivo original. –

0

¿Qué le parece tener una tabla en su base de datos que utiliza el hash como la clave. El otro campo sería el nombre del archivo. De esta forma, el archivo se puede almacenar de manera relacionada con la fecha para una eliminación rápida, y la base de datos se puede usar para buscar rápidamente la ubicación de ese archivo basada en el hash.

1

Reiserfs es relativamente eficiente en el manejo de archivos pequeños. ¿Probaste diferentes Linux file systems? No estoy seguro sobre el rendimiento de eliminación: puede considerar formatear (mkfs) como un sustituto para la eliminación de archivos individuales. Por ejemplo, puede crear un sistema de archivos diferente (cache1, cache2, ...) para cada día de la semana.

1

¿Qué tal esto:

  • tener otra carpeta llamada, por ejemplo, "ToDelete"
  • Cuando se añade un nuevo artículo, obtener la fecha actual y buscar una subcarpeta de "ToDelete" que tiene un nombre indicativo de la fecha actual
  • Si no está allí, cree que
  • Añadir un enlace simbólico al elemento que ha creado en la carpeta actual
  • Crear una tarea programada que va a la carpeta en "ToDelete", que es de la cor rect date y elimine todas las carpetas que están vinculadas.
  • Elimina la carpeta que contiene todos los enlaces.
4

Suponiendo que esto es ext2/3 ¿ha intentado agregar en los directorios indexados? Cuando tienes una gran cantidad de archivos en un directorio en particular, la búsqueda será muy lenta para borrar algo.
use tune2fs -o dir_index para habilitar la opción dir_index.
Al montar un sistema de archivos, asegúrese de usar la opción noatime, que evita que el sistema operativo actualice la información del tiempo de acceso para los directorios (aún necesita modificarlos).
Al mirar la publicación original, parece que solo tiene 2 niveles de direccionamiento indirecto a los archivos, lo que significa que puede tener una gran cantidad de archivos en los directorios de hoja. Cuando hay más de un millón de entradas en estas, encontrará que las búsquedas y los cambios son terriblemente lentos. Una alternativa es utilizar una jerarquía más profunda de directorios, reduciendo la cantidad de elementos en un directorio en particular, por lo tanto, reduciendo el costo de búsqueda y actualizaciones en el directorio individual en particular.

Cuestiones relacionadas