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
quelle
journalctl
läuft nur ein Prozess. Ich habe das Gefühl, dassjournalctl
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 dastime
Ergebnis zu erklären .Antworten:
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 einigemmap()
in der Spur von Systemaufrufen bemerkt .Wenn Sie das
/usr/bin/time
Programm anstelle dertime
eingebauten Shell verwendet hätten, hätten Sie möglicherweise auch Folgendes bemerkt:major
Seitenfehler erfordern Dateisystem-E / A.minor
Seitenfehler sind viel weniger bedeutsam (wahrscheinlich nur ein "TLB-Fehler").Ich vermute,
inputs
die 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üfengetconf 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.
strace
wird 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, diestrace
überhaupt nicht angezeigt werden. Dazu gehören alsoquelle