Il potente strace
mi ha deluso. Com'è possibile?
time foo
mostra che l' foo
esecuzione di alcuni secondi ("reale"), ma utilizza un tempo della CPU trascurabile, sia nello spazio utente ("utente") che nel kernel ("sys"). Per i curiosi, foo
è definito di seguito.
Quindi passa la maggior parte del tempo ad aspettare qualcos'altro, non eseguendo le istruzioni della CPU. Normalmente, posso vedere come sta aspettando strace
, ovvero quale chiamata di sistema sta bloccando per un lungo periodo di tempo. Purtroppo questo approccio non ha funzionato.
strace -ttt -T -C -w foo
mostra le chiamate di sistema, il timestamp e un riepilogo del tempo (reale) trascorso nelle chiamate di sistema. Ma questo particolare processo ha dimostrato di passare un tempo (reale) complessivo trascurabile all'interno delle chiamate di sistema.
foo
è in realtà journalctl -b -u dev-hugepages.mount
. Tranne il fatto che ho dovuto cambiare l'ultimo argomento in un'unità di sistema diversa ogni volta per poterlo riprodurre. In altre parole, il ritardo che sto indagando è avvenuto la prima volta che provo a ottenere i registri per una qualsiasi unità di sistema. EDIT : dopo aver risposto alla domanda principale, ho anche capito il motivo per cui avevo questo problema a riprodurre il ritardo .
Il tempo impiegato da questo processo è un problema specifico, apparentemente non si verifica su tutti i sistemi. https://github.com/systemd/systemd/issues/7963
journalctl
esegua un solo processo. Ho la sensazione che journalctl
usi un thread in più per qualsiasi motivo - tra cui c'era una chiamata clone (). Penso che questo significhi che sei tecnicamente corretto, ma è anche tecnicamente irrilevante per la domanda. time
esamina il processo nel suo insieme e ha dimostrato che il processo nel suo insieme è piuttosto assonnato (bloccando qualcosa). strace
non ha mostrato abbastanza sonno. Non importa se un secondo thread è inattivo, anche il thread principale deve essere molto assonnato per spiegare il time
risultato.