Pregunta ¿Qué significa 'real', 'usuario' y 'sys' en la salida del tiempo (1)?


$ time foo
real        0m0.003s
user        0m0.000s
sys         0m0.004s
$

¿Qué significan 'real', 'usuario' y 'sys' en la salida del tiempo?

¿Cuál es significativo cuando se compara mi aplicación?


1341
2018-02-17 11:33


origen


Respuestas:


Real, usuario y estadísticas de tiempo de proceso Sys

Una de estas cosas no es como la otra. Real se refiere al tiempo real transcurrido; Usuario y Sys se refieren al tiempo de CPU utilizado solo por el proceso.

  • Real es la hora del reloj de pared: tiempo desde el inicio hasta el final de la llamada. Este es todo el tiempo transcurrido, incluidos los intervalos de tiempo utilizados por otros procesos y el tiempo que el proceso permanece bloqueado (por ejemplo, si está esperando a que se complete la E / S).

  • Usuario es la cantidad de tiempo de CPU gastada en código de modo de usuario (fuera del kernel) dentro el proceso. Este es solo el tiempo de CPU real utilizado en la ejecución del proceso. Otros procesos y el tiempo que el proceso permanece bloqueado no cuentan para esta cifra.

  • Sys es la cantidad de tiempo de CPU gastado en el núcleo dentro del proceso. Esto significa ejecutar el tiempo de CPU gastado en las llamadas al sistema dentro del núcleo, a diferencia del código de la biblioteca, que aún se está ejecutando en el espacio del usuario. Como 'usuario', este es solo el tiempo de CPU utilizado por el proceso. Vea a continuación una breve descripción del modo kernel (también conocido como modo 'supervisor') y el mecanismo de llamada al sistema.

User+Sys le dirá cuánto tiempo de CPU real utilizó su proceso. Tenga en cuenta que esto ocurre en todas las CPU, por lo que si el proceso tiene varios hilos (y este proceso se ejecuta en una computadora con más de un procesador) podría exceder el tiempo del reloj de pared informado por Real (que generalmente ocurre). Tenga en cuenta que en el resultado estas cifras incluyen el User y Sys tiempo de todos los procesos secundarios (y sus descendientes), así como cuándo podrían haberse recopilado, p. por wait(2) o waitpid(2), aunque las llamadas al sistema subyacentes devuelven las estadísticas del proceso y sus hijos por separado.

Orígenes de las estadísticas reportadas por time (1)

Las estadísticas reportadas por time se recogen de varias llamadas al sistema. 'Usuario' y 'Sys' provienen de wait (2) o times (2), dependiendo del sistema particular. 'Real' se calcula a partir de un tiempo de inicio y final gettimeofday (2) llamada. Dependiendo de la versión del sistema, varias otras estadísticas como el número de interruptores de contexto también pueden ser recogidos por time.

En una máquina multiprocesador, un proceso de subprocesos múltiples o un proceso de horquillado de niños podría tener un tiempo transcurrido menor que el tiempo total de la CPU, ya que diferentes subprocesos o procesos pueden ejecutarse en paralelo. Además, las estadísticas de tiempo informadas provienen de diferentes orígenes, por lo que los tiempos registrados para tareas muy breves pueden estar sujetos a errores de redondeo, como lo muestra el ejemplo del póster original.

Una breve introducción al modo kernel vs. usuario 

En Unix, o en cualquier sistema operativo de memoria protegida, 'Kernel' o 'Supervisor' modo se refiere a modo privilegiado que la CPU puede operar. Ciertas acciones privilegiadas que podrían afectar la seguridad o la estabilidad solo pueden hacerse cuando la CPU está operando en este modo; estas acciones no están disponibles para el código de la aplicación. Un ejemplo de tal acción podría ser la manipulación del MMU para obtener acceso al espacio de direcciones de otro proceso. Normalmente, modo de usuario el código no puede hacer esto (con buena razón), aunque puede solicitar memoria compartida del kernel, que podría ser leído o escrito por más de un proceso. En este caso, la memoria compartida se solicita explícitamente desde el núcleo a través de un mecanismo seguro y ambos procesos tienen que adjuntarse explícitamente para poder usarla.

El modo privilegiado generalmente se conoce como modo 'kernel' porque el kernel es ejecutado por la CPU que se ejecuta en este modo. Para cambiar al modo kernel, debe emitir una instrucción específica (a menudo llamada trampa) que cambia la CPU a la ejecución en modo kernel y ejecuta el código desde una ubicación específica en una tabla de salto.  Por razones de seguridad, no puede cambiar al modo kernel y ejecutar código arbitrario: las trampas se administran a través de una tabla de direcciones a las que no se puede escribir a menos que la CPU se ejecute en modo supervisor. Atrapas con un número de trampa explícito y la dirección se busca en la tabla de salto; el núcleo tiene un número finito de puntos de entrada controlados.

Las llamadas al 'sistema' en la biblioteca C (particularmente las descritas en la Sección 2 de las páginas man) tienen un componente en modo usuario, que es lo que realmente llama desde su programa C. Detrás de escena, pueden emitir una o más llamadas al kernel para realizar servicios específicos como E / S, pero también tienen código ejecutándose en modo de usuario. También es muy posible emitir directamente una trampa al modo núcleo desde cualquier código de espacio de usuario, si así lo desea, aunque es posible que necesite escribir un fragmento de lenguaje ensamblador para configurar los registros correctamente para la llamada. Puede encontrar una página que describe las llamadas al sistema provistas por el kernel de Linux y las convenciones para configurar registros. aquí.

Más sobre 'sys' 

Hay cosas que su código no puede hacer desde el modo de usuario: cosas como asignar memoria o acceder al hardware (HDD, red, etc.). Estos están bajo la supervisión del kernel, y solo puede hacerlos. Algunas operaciones que haces (como malloc ofread/fwrite) invocará estas funciones Kernel y eso contará como tiempo 'sys'. Desafortunadamente no es tan simple como "cada llamada a malloc se contará en el tiempo 'sys'". La llamada a malloc hará algún procesamiento propio (aún contado en tiempo de 'usuario') y luego en algún punto del camino puede llamar a la función en kernel (contada en tiempo 'sys'). Después de regresar de la llamada al kernel, habrá más tiempo en 'usuario' y luego malloc volverá a su código. En cuanto a cuándo ocurre el cambio, y cuánto de él se gasta en modo kernel ... no se puede decir. Depende de la implementación de la biblioteca. Además, otras funciones aparentemente inocentes también podrían usar malloc y similares en el fondo, que de nuevo tendrán algo de tiempo en 'sys'.


1608
2018-04-29 05:29



Para expandir en el respuesta aceptada, Solo quería brindar otra razón por la cual real ≠ user + sys.

Manten eso en mente real representa el tiempo real transcurrido, mientras user y sys los valores representan el tiempo de ejecución de la CPU. Como resultado, en un sistema multinúcleo, el user y / o sys el tiempo (y su suma) puede realmente exceder el tiempo real. Por ejemplo, en una aplicación Java que estoy ejecutando para la clase, obtengo este conjunto de valores:

real    1m47.363s
user    2m41.318s
sys     0m4.013s

213
2017-11-05 04:34



Real muestra el tiempo total de respuesta para un proceso; mientras que el usuario muestra el tiempo de ejecución para las instrucciones definidas por el usuario ¡y Sys es por tiempo para ejecutar llamadas al sistema!

El tiempo real también incluye el tiempo de espera (el tiempo de espera para E / S, etc.)


14
2017-11-24 19:05



real: El tiempo real invertido en ejecutar el proceso de principio a fin, como si lo midiera un humano con un cronómetro

usuario: El tiempo acumulado gastado por todas las CPU durante el cálculo

sys: El tiempo acumulado gastado por todas las CPU durante las tareas relacionadas con el sistema, como la asignación de memoria.

Tenga en cuenta que a veces el usuario + sys puede ser mayor que real, ya que   múltiples procesadores pueden trabajar en paralelo.


6