El poderoso strace
me ha decepcionado. ¿Cómo es esto posible?
time foo
muestra que foo
tarda 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, foo
se 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 foo
muestra 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.
foo
es 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
journalctl
solo ejecuta un proceso. Tengo la sensación de quejournalctl
usa 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.time
mira el proceso en su conjunto y ha demostrado que el proceso en su conjunto es bastante somnoliento (bloqueando algo).strace
No mostró suficientes sueños. No importa si un segundo hilo está inactivo, el hilo principal también debe tener mucho sueño para explicar eltime
resultado.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/time
programa en lugar deltime
shell incorporado, también podría haber notado:major
Los fallos de página son los que requieren el sistema de archivos IO.minor
los fallos de página son mucho menos significativos (probablemente solo una "falta de TLB").Sospecho que
inputs
son 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.
strace
solo 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 questrace
no se muestran en absoluto. Entonces estos incluyenfuente