Perché `strace` non mostra che questo processo sta aspettando qualcosa?


11

Il potente stracemi ha deluso. Com'è possibile?


time foomostra che l' fooesecuzione 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 foomostra 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


Hmm ... dal momento che il tuo programma "pippo" non è solo un semplice processo a singolo processo, a thread singolo, verrai meglio servito dicendo a strace di seguire e attaccare alle forcelle. '-ff' è tuo amico! :) Quindi vorrai anche usare "-o / dev / shm / strace-foo" per richiamare tutti quei file di output del processo di strafe in una posizione. Solo un suggerimento.
Jesse Adelman,

@JesseAdelman Penso che journalctlesegua un solo processo. Ho la sensazione che journalctlusi 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. timeesamina il processo nel suo insieme e ha dimostrato che il processo nel suo insieme è piuttosto assonnato (bloccando qualcosa). stracenon ha mostrato abbastanza sonno. Non importa se un secondo thread è inattivo, anche il thread principale deve essere molto assonnato per spiegare il timerisultato.
Fontejedi

Risposte:


18

Il solito motivo per colpire questo problema è che il processo sta bloccando gli errori di pagina. Queste sono letture o possibilmente scritture su file eseguite tramite una mappatura della memoria aka mmap(). Potresti aver notato alcuni mmap()nella traccia delle chiamate di sistema.

Se avessi usato il /usr/bin/timeprogramma invece della timeshell incorporata, potresti anche aver notato:

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

majori pagefaults sono quelli che richiedono l'IO del filesystem. minori pagefaults sono molto meno significativi (probabilmente solo un "errore TLB").

Sospetto inputssiano il numero totale di pagine lette. Attualmente, penso che le pagine mappate ai file abbiano sempre le stesse dimensioni. 4096 byte nella maggior parte dei casi, ma è possibile verificare getconf PAGESIZE.

Quindi questo rappresenta ~ 290 megabyte, letto a qualcosa di più di 100 megabyte al secondo, una velocità standard per un disco rigido come il mio. Mistero risolto!


Nota anche che stai presupponendo che tu abbia un'intera CPU gratuita per questo processo. Altrimenti, il processo potrebbe semplicemente essere bloccato in attesa che altri processi producano la CPU.

stracemostra solo quando il processo entra (e poi lascia) il kernel a causa di una chiamata di sistema. O quando viene inviato un segnale unix. Tuttavia, esistono altri tipi di interrupt che stracenon vengono visualizzati affatto. Quindi questi includono

  • Errori della pagina.
  • Il timer si interrompe. Questo è usato per passare a un processo diverso, quando quello attuale ha esaurito il suo intervallo di tempo assegnato sulla CPU.

1
Buona risposta, complimenti! È davvero importante comprendere i limiti degli strumenti che si stanno utilizzando. +1; Mi piace anche questo argomento: unix.stackexchange.com/questions/418354/… e unix.stackexchange.com/questions/419697/…
Rui F Ribeiro,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.