Tengo este código para optimizar el tamaño de la imagen de todas mis imágenes dentro /dir
del directorio:
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
Cuando ejecuto este código, consume gran parte de la CPU de mi servidor. Entonces me pregunto: ¿es posible agregar un retraso entre cada uno exec
? Por ejemplo, quiero 100 milisegundos de retraso entre cada vez que exec
se llama a cada imagen, de esta manera la CPU no se ocupa mucho.
¿Qué sugieres? Mi servidor ejecuta Centos 8.
Respuesta1
También puedes agregar más comandos usando más -exec
s.
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \; -exec sleep 0.1 \;
Pero por norma general si quieres tenerlo funcionando a tope pero estandolindoPara otros procesos, es muy sencillo utilizar nice:
nice find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec jpegoptim --strip-all {} \;
Respuesta2
Esta es la razón por la que se crearon comandos como nice
y .ionice
nice
Se puede utilizar para reducir la prioridad de la CPU del proceso.ionice
Se puede utilizar para reducir la prioridad de E/S del proceso.
Una combinación de estos puede garantizar que su proceso requiera solo una pequeña porción del procesador disponible y de la capacidad de E/S. Este ejemplo lleva el proceso IO al extremo más bajo de la clase de "mejor esfuerzo":
ionice -c2 -n7 find...
Cambie -c2
a -c3
para garantizar que su proceso solo se ejecute cuando el subsistema IO esté inactivo.
Este ejemplo reduce la asignación del procesador a una prioridad baja:
nice -n12 find...
Cambie -n12
a -n19
la menor prioridad posible.
Combínalos para obtener el máximo efecto:
ionice -c2 -n7 nice -n12 find...
Respuesta3
Puede usar un bucle de shell con -exec
la opción de find
que ejecute un bucle for jpegoptim
para cada archivo de imagen encontrado, con un retraso adicional
find /dir/ -iregex ".*\.\(jpg\|jpeg\)" -exec sh -c '
for file; do jpegoptim --strip-all "$file"; sleep 0.1; done' -- {} +
Respuesta4
Al usar -exec cmd ... {} ';'
, estás ejecutando una instancia de cmd
para cada archivo. jpegoptim
puede procesar más de un archivo por invocación, por lo que evitaría mucho trabajo a su CPU cambiándolo a -exec cmd ... {} +
:
LC_ALL=C nice find . '(' -name '*.[jJ][pP][gG]' -o -name '*.[jJ][pP][eE][gG]' ')' \
-type f -exec jpegoptim --strip-all {} +
(aquí con el find
comando convertido a sintaxis estándar y mejorado para que coincida contodonombres de archivos que terminan en .jpg
o .jpeg
sin distinguir entre mayúsculas y minúsculas y restringidos a archivos normales).
nice
le dice al programador que priorice otras tareas sobre las que se están ejecutando find
o jpegoptim
. Es mucho más eficiente que realizar esas tareas de sleep
forma arbitraria, incluso cuando sus procesadores tienen mucho tiempo de sobra (también considere que se necesita algo de tiempo de CPU para ejecutar, cargar, inicializar, etc., una sleep
utilidad).