¿Cómo evitar que la eliminación del subárbol (`rm -rf`) elimine el hambre de otros procesos para la E / S de disco?

8

Tenemos un directorio de caché Nginx muy grande (multi-GB) para un sitio ocupado, que ocasionalmente necesitamos borrar de una vez. He resuelto esto en el pasado moviendo la carpeta de caché a una nueva ruta, creando una nueva carpeta de caché en la ruta anterior y luego rm -rfagregando la carpeta de caché anterior.

Últimamente, sin embargo, cuando necesito borrar el caché en una mañana ocupada, la E / S rm -rfestá privando a los procesos de acceso al disco de mi servidor, ya que tanto Nginx como el servidor al que se dirige son de lectura intensiva. Puedo ver el aumento promedio de carga mientras las CPU permanecen inactivas y rm -rfocupan el 98-99% del disco IO iotop.

Lo he intentado ionice -c 3al invocar rm, pero parece no tener un efecto apreciable en el comportamiento observado.

¿Hay alguna manera de domesticar rm -rfpara compartir más el disco? ¿Necesito usar una técnica diferente que tome sus señales ionice?

Actualizar:

El sistema de archivos en cuestión es un almacén de instancias de AWS EC2 (el disco primario es EBS). La /etc/fstabentrada se ve así:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2
David Eyk
fuente
Probablemente también debería mencionar el sistema de archivos que está utilizando y cómo (opciones de montaje).
Cristian Ciupitu
Actualizado. Además, en caso de que sea importante, esto está en Ubuntu 12.04.
David Eyk
Tenga en cuenta que el rendimiento de IO en Amazon EBS puede ser bastante malo. Vea perfcap.blogspot.com/2011/03/… que recomienda un máximo a largo plazo de 100 iops, con ráfagas a corto plazo (1 minuto) hasta 1000. Parece que su caso es mucho más alto que eso en un minuto, De ahí el problema.
Moshe Katz
Bien, por eso estamos usando una tienda de instancias, no EBS, para el caché. Ver mi comentario de actualización. Lo siento si eso no estaba claro.
David Eyk
Lo siento, llego tarde, pero podría investigar cgroups y el controlador blkio
AndreasM

Respuestas:

3

Todos los datos recopilados de esta página. A continuación hay algunas opciones para eliminar un gran directorio de archivos. Echa un vistazo a la escritura para los detalles de cómo se produjo esto.

Comando Tiempo transcurrido del sistema% CPU cs1 * (Vol / Invol)
rsync -a –delete empty / a 10.60 1.31 95% 106/22
encontrar b / -type f -delete 28.51 14.46 52% 14849/11
encontrar c / -type f | xargs -L 100 rm 41.69 20.60 54% 37048/15074
encontrar d / -type f | xargs -L 100 -P 100 rm 34.32 27.82 89% 929897/21720
rm -rf f 31.29 14.80 47% 15134/11

* cs1 es el contexto cambia de forma voluntaria e involuntaria

Back2Basics
fuente
Si bien esto puede responder teóricamente la pregunta, sería preferible incluir aquí las partes esenciales de la respuesta y proporcionar el enlace para referencia.
Tom O'Connor
¡Fascinante! Lo intentaré.
David Eyk
rsyncestá funcionando ahora mismo. Tal vez sea demasiado pronto para saberlo, y podría ser útil que no lo esté ejecutando en medio de una mañana ocupada, pero el servidor todavía responde y el promedio de carga es manejable.
David Eyk
La invocación exacta que estoy usando:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk
Bueno, eso solo tomó 4 horas. ;) Voy a aceptar esta respuesta (@aferber siento) como me gusta la invocación directa y parece ser susceptible a nicey ionice, o al menos no destruyó el servidor al igual que rm -rflo hizo.
David Eyk
9

La eliminación de archivos solo realiza operaciones de metadatos en el sistema de archivos, que no están influenciados por ionice.

La forma más sencilla sería, si no necesita el espacio en disco en este momento, realizarlo rmdurante las horas de menor actividad.

La forma más compleja en que PODRÍA funcionar es distribuir las eliminaciones a lo largo del tiempo. Puede probar algo como lo siguiente (tenga en cuenta que asume que sus rutas y nombres de archivo NO contienen espacios):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

También tenga en cuenta que no puede usar rm -fel primer comando porque entonces el ciclo no se detendría (depende del código de salida de error de rmcuando no hay argumento).

Puede modificarlo modificando el número de eliminaciones por ciclo (100 en el ejemplo) y la duración del sueño. Sin embargo, es posible que realmente no funcione, ya que el sistema de archivos aún puede agrupar las actualizaciones de metadatos de manera que tenga problemas con su carga de E / S. Sólo tienes que intentarlo.

aferber
fuente
La eliminación de tantos archivos lleva mucho tiempo, por lo que realmente no hay un período "fuera de temporada" que lo abarque. :(
David Eyk
El whilebucle parece hacer el truco cuando head -n 50. 100 seguía aumentando lentamente el promedio de carga por encima de lo crítico, lo que me dice que estaba sucediendo demasiada contención de recursos.
David Eyk
Hombre, eso lleva mucho tiempo correr!
David Eyk
El hallazgo seguirá enumerando todos los archivos en el directorio y todos los subdirectorios para cada iteración del ciclo while. Probablemente podría mejorar con algo como
Randy Orrison
1
El hallazgo seguirá enumerando todos los archivos en el directorio y todos los subdirectorios para cada iteración del ciclo while. Probablemente podría mejorar con algo como find dir -type f -print0 | xargs -l50 -0 rmwait donde rmwait es un script que hace rm "$ @"; sleep 2. Tenga en cuenta el uso de -print0 y -0 para manejar nombres de archivos con espacios. -l50 le dice a xargs que solo haga 50 a la vez.
Randy Orrison
-1

Puede emparejarlo con el comando "agradable". ionice -c 3 nice -19 rm -rf /some/folder

Esto cambia la prioridad del proceso en la máquina.

Back2Basics
fuente
Desafortunadamente, niceparece tener tanto efecto como ionice, es decir, nada apreciable.
David Eyk
@DavidEyk. Si agradable e ionizante no tienen un efecto "notable", significa que nada más está compitiendo por recursos de manera apreciable, o simplemente no estás notando el efecto a simple vista. Realmente debería compararlo con iostat y vmstat para ver el efecto real.
Michael Martinez
Creo que @aferber abordó esto en su respuesta: "Eliminar archivos solo realiza operaciones de metadatos en el sistema de archivos, que no están influenciados por ionice". He visto la disputa: los procesos de mi servidor estaban muriendo de hambre durante el tiempo de lectura, mientras que la CPU descansaba y rm -rftenía el 99% encendido iotop.
David Eyk