Evitar que el alquitrán use demasiada CPU y disco (la computadora portátil vieja se bloquea si es 100%)

15

Quiero hacer una copia de seguridad de 1 terabyte de datos en un disco externo.

Estoy usando este comando: tar cf /media/MYDISK/backup.tar mydata

PROBLEMA: Mi pobre computadora portátil se congela y se bloquea cada vez que uso 100% de CPU o 100% de disco (si desea reaccionar al respecto, escriba aquí ) . Así que quiero quedarme con alrededor del 50% de CPU y 50% de disco máximo.

Mi pregunta: ¿Cómo estrangular la CPU y el disco con el tarcomando?

Rsync tiene una opción --bwlimit, pero quiero un archivo porque 1) hay muchos archivos pequeños 2) Prefiero administrar un solo archivo en lugar de un árbol. Por eso lo uso tar.

Nicolas Raoul
fuente
1
Qué idea más inteligente para hacer un tarball tan grande: DDD ¿Qué pasa con el comando 'agradable'?
jirib
1
@JiriXichtkniha: niceno impedirá el uso del 100% de la CPU
Nicolas Raoul

Respuestas:

22

Puede usar pvpara estrangular el ancho de banda de una tubería. Dado que su caso de uso está fuertemente vinculado a las E / S, la sobrecarga de CPU agregada de pasar por una tubería no debería ser notable, y no necesita hacer ninguna aceleración de la CPU.

tar cf - mydata | pv -L 1m >/media/MYDISK/backup.tar
Gilles 'SO- deja de ser malvado'
fuente
1
¡Incluso mejor de lo que esperaba! Estoy limitando la E / S a 5 mb / segundo y la CPU permanece en 13% (parece razonable con el cifrado en curso).
Nicolas Raoul
1
¡Muy agradable!. Quizás también recomiende la bandera -q para eliminar la barra de progreso.
szabgab
¡Qué gran comando! Si no lo tiene en su Debian / Ubuntu, simplemente ejecute apt-get install pv. Recomiendo agregar `-b` después -L 1m: de esta manera se imprimirá un contador de bytes incremental, actualizado cada segundo. De esta manera usted sabe cuántos bytes se han escrito hasta ahora
lucaferrario
Además, tenga en cuenta que si comprime la salida (usando en tar czflugar de tar cf) el límite se refiere a la salida comprimida (por lo tanto, con -L 1msu escritura de disco no excederá de 1 MB / s ... pero la lectura de su disco estará probablemente entre 1 MB / s y 5 MB / s, dependiendo de su tipo de contenido)
lucaferrario
Gran truco! Al comprimir con xz, primero canalizo a través de pv y luego a través de xz.
Jean-Bernard Jansen
8

Puede probar la herramienta cpulimit que limita el porcentaje de CPU. No es una herramienta estándar, por lo que deberá instalarla. Aquí hay un extracto rápido de README:

"Cpulimit es una herramienta que intenta limitar el uso de CPU de un proceso (expresado en porcentaje, no en tiempo de CPU). [...] El control de la cantidad de CPU utilizada se realiza enviando señales SIGSTOP y SIGCONT POSIX a los procesos. Todos los procesos secundarios y los subprocesos del proceso especificado compartirán el mismo porcentaje de CPU ".

Entonces recomendaría ionice para limitar el uso de IO, aunque es el acceso concurrente lo que sería limitado, no el rendimiento máximo ... Sin embargo, aquí es cómo usarlo:

ionice -c 3 <your_command>
Huygens
fuente
¡Excelente! Parece que cpulimit es lo que estaba buscando.
Nicolas Raoul
2

Realmente no puede hacer que un proceso se ejecute menos . Puede usar nicepara darle una prioridad más baja, pero eso está en relación con otros procesos. La forma de ejecutar el enfriador de la CPU mientras se ejecuta un proceso es usar usleep(3)para forzar el proceso fuera del estado de ejecución una cierta cantidad de tiempo, pero eso implicaría parchear taro usar el LD_PRELOADmecanismo para proporcionar una función parcheada que tarusa mucho (p. Ej. fopen(3))

Sospecho que sus mejores soluciones son las de hardware que ha mencionado en SuperUser: mantener la computadora portátil fresca y / o bajar el reloj de la CPU.

Una solución molesta pero posiblemente viable (un error, realmente) funciona a un nivel 'macroscópico'. En lugar de hacer tarcorrer 100 ms cada 200 ms, puede hacer que se ejecute un segundo de cada dos. Nota: este es un horrible, horrible kludge. Pero bueno, ¡incluso podría funcionar!

tar cjf some-file.tar.bz2 /some-directory &
while true; do
    sleep 1  # Let it run for a second
    kill -STOP $! 2>/dev/null || break
    sleep 1  # Pause it for a second
    kill -CONT $! 2>/dev/null || break
done

El primero sleep ajusta el tiempo de sueño, el segundo ajusta el tiempo de ejecución. Tal como está ahora, tiene un ciclo de trabajo del 50%. Para mantener baja la temperatura, es probable que necesite reducir el ciclo de trabajo a quizás un 25% o menos (1 segundo de funcionamiento, 3 segundos de reposo = 1 de cada 4 segundos = 25% de ciclo de trabajo). El comando de shell sleeppuede tomar fracciones de tiempo, por cierto. Así que incluso podrías decir sleep 0.1. Manténgalo por encima de 0.001 solo para estar seguro, y no olvide que la ejecución del script también aumenta el tiempo.

Alexios
fuente
+1 ¡Buena idea! Supongo que es similar a la herramienta cpulimit que sugiere Huygens.
Nicolas Raoul
Excepto que la herramienta de Huuygens es mucho mejor y más práctica, por eso esa respuesta obtuvo mi propio +1. :)
Alexios
0

Una forma más general de limitar la CPU es usar /sys . De todos modos, esto parece lo que quieres, ya que otras cosas que no tarson capaces de realizar tareas computacionalmente costosas, es solo que lo estás viendo tarhacer más.

La forma de hacer esto es:

  1. ir /sys/devices/system/cpu/cpuX/cpufreq para cada una de sus CPU (reemplace cpuXcon cada CPU).
  2. Luego mira en el archivo scaling_available_frequencies para ver qué frecuencias admite su CPU.
  3. Elija una frecuencia (digamos 1234567) y haga echo 1234567 > scaling_max_freq

Esto evitará que la CPU supere la frecuencia especificada.

Patricio
fuente
Gracias, pero ya estoy en la frecuencia más baja posible. Debería haber mencionado eso. Comencé a hacer overclocking tan pronto como comenzaron a aparecer estos problemas.
Nicolas Raoul