Warum zeigt "strace" nicht, dass dieser Prozess auf etwas wartet?

11

Der Mächtige stracehat mich im Stich gelassen. Wie ist das möglich?


time foozeigt, dass foodie Ausführung einige Sekunden dauert ("real"), aber eine vernachlässigbare CPU-Zeit verwendet, sowohl im Userspace ("user") als auch im Kernel ("sys"). Für die Neugierigen foowird unten definiert.

Daher verbringt es die meiste Zeit damit, auf etwas anderes zu warten und keine CPU-Anweisungen auszuführen. Normalerweise kann ich sehen, wie es wartet strace- dh welcher Systemaufruf blockiert für einen langen Zeitraum. Leider hat dieser Ansatz nicht funktioniert.

strace -ttt -T -C -w fooZeigt Systemaufrufe mit Zeitstempel und eine Zusammenfassung der (Echtzeit-) Zeit, die für Systemaufrufe aufgewendet wurde. Dieser spezielle Prozess zeigte sich jedoch als vernachlässigbarer Gesamtaufwand (Echtzeit) innerhalb von Systemaufrufen.


fooist eigentlich journalctl -b -u dev-hugepages.mount. Nur dass ich das letzte Argument jedes Mal in eine andere systemd-Einheit ändern musste, um dies zu reproduzieren. Mit anderen Worten, die Verzögerung, die ich untersuche, ist beim ersten Versuch aufgetreten, die Protokolle für eine systemd-Einheit abzurufen. BEARBEITEN : Nachdem ich die Hauptfrage beantwortet hatte, wurde mir auch klar, warum ich dieses Problem hatte, die Verzögerung zu reproduzieren .

Die für diesen Prozess aufgewendete Zeit ist ein spezifisches Problem, das anscheinend nicht auf allen Systemen auftritt. https://github.com/systemd/systemd/issues/7963

sourcejedi
quelle
Hmm ... da Ihr "foo" -Programm nicht nur ein einfacher Prozess mit einem einzigen Prozess und einem einzigen Thread ist, sollten Sie Strace besser anweisen, den Gabeln zu folgen und sie an ihnen zu befestigen. '-ff' ist dein Freund! :) Sie sollten dann auch "-o / dev / shm / strace-foo" verwenden, um alle diese strafe-Prozessausgabedateien an einem Ort zu speichern. Nur ein Vorschlag.
Jesse Adelman
@ JesseAdelman Ich denke, journalctlläuft nur ein Prozess. Ich habe das Gefühl, dass journalctlaus irgendeinem Grund ein zusätzlicher Thread verwendet wird - es gab einen Aufruf von clone (). Ich denke, das bedeutet, dass Sie technisch korrekt sind, aber es ist auch technisch irrelevant für die Frage. timeBetrachtet den Prozess als Ganzes und hat gezeigt, dass der Prozess als Ganzes ziemlich schläfrig ist (etwas blockieren). stracezeigte nicht genug Schlaf. Es spielt keine Rolle, ob ein zweiter Thread schläft, der Haupt-Thread muss auch sehr schläfrig sein, um das timeErgebnis zu erklären .
Sourcejedi

Antworten:

18

Der übliche Grund für dieses Problem ist, dass der Prozess bei Seitenfehlern blockiert. Dies sind Lese- oder Schreibvorgänge in Dateien, die über eine Speicherzuordnung (aka) ausgeführt werden mmap(). Möglicherweise haben Sie einige mmap()in der Spur von Systemaufrufen bemerkt .

Wenn Sie das /usr/bin/timeProgramm anstelle der timeeingebauten Shell verwendet hätten, hätten Sie möglicherweise auch Folgendes bemerkt:

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

majorSeitenfehler erfordern Dateisystem-E / A. minorSeitenfehler sind viel weniger bedeutsam (wahrscheinlich nur ein "TLB-Fehler").

Ich vermute, inputsdie Gesamtzahl der gelesenen Seiten ist. Derzeit denke ich, dass dateikartierte Seiten immer die gleiche Größe haben. 4096 Bytes in den meisten Fällen, aber Sie können überprüfen getconf PAGESIZE.

Dies entspricht also ~ 290 Megabyte, gelesen mit etwas über 100 Megabyte pro Sekunde, eine Standardgeschwindigkeit für eine Festplatte wie meine. Geheimnis gelüftet!


Beachten Sie auch, dass Sie davon ausgehen, dass Sie für diesen Prozess eine ganze freie CPU haben. Andernfalls könnte der Prozess einfach blockiert werden und darauf warten, dass andere Prozesse die CPU liefern.

stracewird nur angezeigt, wenn der Prozess aufgrund eines Systemaufrufs in den Kernel eintritt (und diesen dann verlässt). Oder wenn ein Unix-Signal geliefert wird. Es gibt jedoch andere Arten von Interrupts, die straceüberhaupt nicht angezeigt werden. Dazu gehören also

  • Seitenfehler.
  • Der Timer-Interrupt. Dies wird verwendet, um zu einem anderen Prozess zu wechseln, wenn der aktuelle seine zugewiesene Zeitscheibe auf der CPU erschöpft hat.
sourcejedi
quelle
1
Gute Antwort, Glückwunsch! Es ist in der Tat wichtig, die Einschränkungen der verwendeten Tools zu verstehen. +1; Ich mag auch dieses Thema: unix.stackexchange.com/questions/418354/… und unix.stackexchange.com/questions/419697/…
Rui F Ribeiro