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
fuente

journalctlsolo ejecuta un proceso. Tengo la sensación de quejournalctlusa 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 eltimeresultado.Respuestas:
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 algunosmmap()en el seguimiento de las llamadas al sistema.Si hubiera utilizado el
/usr/bin/timeprograma en lugar deltimeshell incorporado, también podría haber notado: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 verificargetconf 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 questraceno se muestran en absoluto. Entonces estos incluyenfuente