Tengo el sistema de archivos ext3 montado con opciones predeterminadas. En él tengo algunos archivos ~ 100GB.
La eliminación de cualquiera de estos archivos lleva mucho tiempo (8 minutos) y genera mucho tráfico io, lo que aumenta la carga en el servidor.
¿Hay alguna manera de hacer que la rm no sea tan perjudicial?
Respuestas:
La respuesta más interesante fue originalmente enterrada en un comentario sobre la pregunta. Aquí está como una respuesta de primera clase para hacerlo más visible:
Ese enlace es un análisis increíblemente exhaustivo de la exploración y el descubrimiento de una solución viable.
Tenga en cuenta también:
El artículo dice:
lo cual es cierto, pero el usuario TafT dice que si no desea ninguna interrupción,
-c3
'inactivo' sería una mejor opción que-c2
'mejor esfuerzo'. Solía-c3
construir en segundo plano y descubrió que funcionaba bien sin hacer que la construcción esperara para siempre. Si realmente tiene un uso del 100% de io, entonces-c3
no permitirá que la eliminación se complete nunca, pero no espera que eso sea lo que haya hecho según la prueba realizada.fuente
Actualice a ext4 o algún otro sistema de archivos moderno que use extensiones. Dado que ext3 usa el esquema de bloques indirectos en lugar de extensiones, la eliminación de archivos grandes inevitablemente implica mucho trabajo.
fuente
Puedes probar ionice . No lo hará más rápido, pero podría hacerlo menos perjudicial.
fuente
En términos de eficiencia, el uso de un rm por archivo no es óptimo, ya que requiere una bifurcación y un exec para cada rm.
Suponiendo que tiene una lista.txt que contiene los archivos que desea eliminar, esto sería más eficiente, pero aún así será lento:
Otro enfoque sería:
nice -20 xargs -i rm {} < list.txt
(esto tomará menos tiempo pero afectará mucho a su sistema :)
o
No sé qué tan rápido sería, pero:
o
Cree un punto de montaje especial con un sistema de archivos rápido (¿utilizando un dispositivo de bucle?), Úselo para almacenar y eliminar sus archivos enormes.
(tal vez mueva los archivos allí antes de eliminarlos, tal vez sea más rápido o tal vez simplemente desmóntelo cuando desee que se vayan los archivos)
o
cat /dev/null > /file/to/be/deleted
(así que ahora es de tamaño cero) y si quieres que desaparezca justorm -rf <file>
ahorao incluso mejor
suelta al gato y solo hazlo
# > /file/to/be/emptied
fuente
Tuve problemas para eliminar el directorio a un ritmo razonable, resultó que el proceso estaba bloqueando el disco y creando una pila de procesos que intentaban acceder al disco. ionice no funcionó, simplemente continuó usando el 99% del disco IO y bloqueó todos los demás procesos.
Aquí está el código de Python que funcionó para mí. Elimina 500 archivos a la vez, luego toma un descanso de 2 segundos para permitir que los otros procesos hagan su trabajo, luego continúa. Funciona genial.
fuente
Mis dos centavos.
Ya tengo este problema. "En las secuencias de comandos secuenciales que deben ejecutarse rápidamente, el proceso elimina una gran cantidad de archivos". Por lo tanto, "rm" hará que la velocidad de la secuencia de comandos se acerque al tiempo de espera / ejecución de E / S.
Entonces, para hacer las cosas más rápido, agregué otro proceso (script bash) lanzado por cron ... como un recolector de basura, elimina todos los archivos en un directorio en particular.
Luego actualicé el script original reemplazando el "rm" por un mv en una "carpeta de basura" (cambie el nombre del archivo agregando un contador al final de su nombre para evitar colisiones).
Esto funciona para mí, el script se ejecuta al menos 3 veces más rápido. pero funciona bien solo si la carpeta de basura y el archivo original están bajo el mismo punto de montaje (mismo dispositivo) para evitar la copia del archivo. (mv en el mismo dispositivo consume menos IO que rm)
Espero que ayude ..
fuente
También tenga en cuenta que la respuesta de Dennis Williamson, quien sugiere ionice como una solución para la carga, funcionará solo si su dispositivo de bloque usa el programador CFQ io.
fuente
Puede intentar crear un sistema de archivos de bucle para almacenar sus copias de seguridad.
Luego, cuando desee borrar las copias de seguridad:
¡Presto! Todo el sistema de archivos virtual se borra en cuestión de minutos.
fuente
Puedes usar multitheading con xargs
donde 30 es el número de subprocesos que desea crear. Si está utilizando cero, el sistema crea subprocesos máximos disponibles para el usuario que ejecuta la tarea.
fuente
find
tiene una-delete
opción que es una alternativa mucho mejor./ dev / null es un archivo, no un directorio. No puede mover un archivo a un archivo, o corre el riesgo de sobrescribirlo.
No creo que esto sea práctico. Usaría innecesariamente más E / S de lo que le gustaría al OP.
fuente
En realidad es un dispositivo y todos los datos escritos se descartan, por lo que
mv <file> /dev/null
tiene sentidofuente