Tengo un script que convierte archivos de video y lo ejecuto en el servidor con datos de prueba y mido su tiempo mediante time
. En resultado vi:
real 2m48.326s
user 6m57.498s
sys 0m3.120s
¿Por qué el tiempo real es mucho menor que el tiempo del usuario? ¿Tiene esto alguna conexión con el subproceso múltiple? ¿O qué más?
Editar:Y creo que el script se ejecutó alrededor de 2m48s.
Respuesta1
El resultado que muestra es un poco extraño, ya que el tiempo real normalmente sería mayor que los otros dos.
Real
el tiempo es el tiempo del reloj de pared. (lo que podríamos medir con un cronómetro)User
El tiempo es la cantidad de tiempo que se pasa en modo usuario dentro del proceso.Sys
es el tiempo de CPU empleado en el kernel dentro del proceso.
Entonces, supongo que si el trabajo lo realizaran varios procesadores al mismo tiempo, el tiempo de la CPU sería mayor que el tiempo transcurrido del reloj de pared.
¿Era este un tipo de aplicación concurrente/multiproceso/paralela?
A modo de ejemplo, esto es lo que obtengo en mi sistema Linux cuando ejecuto el time find .
comando. Como era de esperar, el tiempo transcurrido real
es mucho mayor que el de los demás en este proceso de usuario único/núcleo único.
real 0m5.231s
user 0m0.072s
sys 0m0.088s
La regla general es:
- real <usuario: el proceso está vinculado a la CPU y aprovecha la ejecución paralela en múltiples núcleos/CPU.
- usuario real ≈: el proceso está vinculado a la CPU y no aprovecha la ejecución paralela.
- real > usuario: El proceso está vinculado a E/S. La ejecución en múltiples núcleos tendría poca o ninguna ventaja.
Respuesta2
Solo para ilustrar lo que se ha dicho, con dos procesos de subprocesos haciendo algunos cálculos.
/*a.c/*
#include <pthread.h>
static void * dosomething () {
unsigned long a,b=1;
for (a=1000000000; a>0; a--) b*=3;
return NULL;
}
main () {
pthread_t one, two;
pthread_create(&one,NULL, dosomething, NULL);
pthread_create(&two,NULL, dosomething, NULL);
pthread_join (one, NULL);
pthread_join (two, NULL);
}
/* end of a.c */
compilar
gcc a.c -lpthread
(Esto es sólo para ilustrar, en la vida real debería haber agregado el indicador -D_REENTRANT)
$ time ./a.out
real 0m7.415s
user 0m13.105s
sys 0m0.032s
(Los tiempos están en un Intel Atom que tiene dos núcleos lentos :))
Respuesta3
No es necesario que sean programas de subprocesos múltiples; Puede obtener el mismo efecto con múltiples procesos. Escribí un programa en C para hacer algunos cálculos numéricos triviales:
$ time ./runner
real 1m12.746s
user 1m12.493s
sys 0m0.015s
Luego escribí un script para ejecutar dos copias del proceso:
$ cat run_script
#!/bin/sh
./runner &
./runner &
wait
$ time ./run_script
real 1m31.231s
user 3m0.538s
sys 0m0.215s
Respuesta4
Como dijo Levón:
Tengo un i7 (8 procesadores), así que si lo ejecuto en bash
:
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m4,878s
user 0m4,368s
sys 0m3,083s
Entonces, si restringimos bash a un proceso contaskset -cp 0 $BASHPID
$ taskset -cp 0 $BASHPID
pid 30551's current affinity list: 0-7
pid 30551's new affinity list: 0
ahora el resultado es
$ time for ((i=0;i<1000000;i++)); do echo $i; done | wc -l
1000000
real 0m7,120s
user 0m4,282s
sys 0m2,824s
https://www.looklinux.com/how-to-run-process-or-program-on-specific-cpu-cores-in-linux/