Der Mächtige strace
hat mich im Stich gelassen. Wie ist das möglich?
time foo
zeigt, dass foo
die 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 foo
wird 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 foo
Zeigt 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.
foo
ist 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
journalctl
läuft nur ein Prozess. Ich habe das Gefühl, dass journalctl
aus 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. time
Betrachtet den Prozess als Ganzes und hat gezeigt, dass der Prozess als Ganzes ziemlich schläfrig ist (etwas blockieren). strace
zeigte nicht genug Schlaf. Es spielt keine Rolle, ob ein zweiter Thread schläft, der Haupt-Thread muss auch sehr schläfrig sein, um das time
Ergebnis zu erklären .