¿Por qué "strace" no muestra que este proceso está esperando algo?


11

El poderoso straceme ha decepcionado. ¿Cómo es esto posible?


time foomuestra que footarda varios segundos en ejecutarse ("real"), pero utiliza un tiempo de CPU insignificante, tanto en el espacio de usuario ("usuario") como en el núcleo ("sys"). Para los curiosos, foose define a continuación.

Por lo tanto, pasa la mayor parte del tiempo esperando algo más, sin ejecutar las instrucciones de la CPU. Normalmente, puedo ver cómo está esperando strace, es decir, qué llamada del sistema está bloqueando durante un largo período de tiempo. Lamentablemente, este enfoque no funcionó.

strace -ttt -T -C -w foomuestra las llamadas al sistema, marca de tiempo y un resumen del tiempo (real) empleado en las llamadas al sistema. Pero este proceso en particular se mostró como un tiempo total (real) insignificante dentro de las llamadas al sistema.


fooes en realidad journalctl -b -u dev-hugepages.mount. Excepto que tuve que cambiar el último argumento a una unidad systemd diferente cada vez para reproducir esto. En otras palabras, la demora que estoy investigando ocurrió la primera vez que intenté obtener los registros de cualquier unidad systemd. EDITAR : después de responder la pregunta principal, también me di cuenta de la razón por la que tenía este problema al reproducir el retraso .

El tiempo empleado por este proceso es un problema específico, aparentemente no ocurre en todos los sistemas. https://github.com/systemd/systemd/issues/7963


Hmm ... ya que su programa "foo" no es un simple proceso de un solo proceso, de un solo subproceso, sería mejor que le diga a strace que siga y se una a las horquillas. '-ff' es tu amigo! :) También querrás, entonces, usar "-o / dev / shm / strace-foo" para agrupar todos esos archivos de salida del proceso de strafe en una ubicación. Sólo una sugerencia.
Jesse Adelman el

@JesseAdelman Creo que journalctlsolo ejecuta un proceso. Tengo la sensación de que journalctlusa un hilo adicional por cualquier razón: iirc hubo una llamada clone (). Creo que esto significa que eres técnicamente correcto, pero también es técnicamente irrelevante para la pregunta. timemira el proceso en su conjunto y ha demostrado que el proceso en su conjunto es bastante somnoliento (bloqueando algo). straceNo mostró suficientes sueños. No importa si un segundo hilo está inactivo, el hilo principal también debe tener mucho sueño para explicar el timeresultado.
sourcejedi

Respuestas:


18

La razón habitual para resolver este problema es que el proceso está bloqueando las fallas de la página. Estas son lecturas o posiblemente escrituras en archivos realizados a través de un mapeo de memoria aka mmap(). Es posible que haya notado algunos mmap()en el seguimiento de las llamadas al sistema.

Si hubiera utilizado el /usr/bin/timeprograma en lugar del timeshell incorporado, también podría haber notado:

0.04user 0.10system 0:02.29elapsed 6%CPU (0avgtext+0avgdata 40464maxresident)k
73632inputs+0outputs (376major+1081minor)pagefaults 0swaps

majorLos fallos de página son los que requieren el sistema de archivos IO. minorlos fallos de página son mucho menos significativos (probablemente solo una "falta de TLB").

Sospecho que inputsson el número total de páginas leídas. Actualmente, creo que las páginas mapeadas de archivos son siempre del mismo tamaño. 4096 bytes en la mayoría de los casos, pero puede verificar getconf PAGESIZE.

Esto representa ~ 290 megabytes, leídos a algo más de 100 megabytes por segundo, una velocidad estándar para un disco duro como el mío. ¡Misterio resuelto!


Tenga en cuenta también que está asumiendo que tiene una CPU completamente libre para este proceso. De lo contrario, el proceso simplemente podría bloquearse esperando que otros procesos cedan la CPU.

stracesolo se muestra cuando el proceso ingresa (y luego sale) del núcleo debido a una llamada al sistema. O cuando se entrega una señal unix. Sin embargo, hay otros tipos de interrupciones que straceno se muestran en absoluto. Entonces estos incluyen

  • Fallos de página.
  • El temporizador interrumpe. Esto se utiliza para cambiar a un proceso diferente, cuando el actual ha agotado su segmento de tiempo asignado en la CPU.

1
Buena respuesta, felicidades! De hecho, es importante comprender las limitaciones de las herramientas que uno está usando. +1; También disfruto de este tema: unix.stackexchange.com/questions/418354/… y unix.stackexchange.com/questions/419697/…
Rui F Ribeiro
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.