Ich habe ein paar Prozesse, die viel System-CPU-Zeit verbrauchen (wie durch Betrachten von vmstat bestimmt). Gibt es eine einfache Möglichkeit herauszufinden, welche Systemaufrufe getätigt werden?
Ich weiß, dass es Strace gibt, aber gibt es einen schnelleren und einfacheren Weg? Gibt es so etwas wie ein "Top" für Systemaufrufe?
linux
performance
monitoring
central-processing-unit
strace
bajafresh4life
quelle
quelle
Antworten:
Ich denke, die Strace mit der
-c
Flagge ist wahrscheinlich die nächste, die ich kenne. Wenn Sie die-c
Flagge nicht verwendet haben , versuchen Sie Folgendes:Dabei ist 12345 die Prozess-ID (PID) des betreffenden Prozesses. Beachten Sie, dass das Stracing eines Prozesses zusätzlichen Overhead verursacht. Während Sie ihn verfolgen, wird der Prozess langsamer ausgeführt.
Nachdem Sie das so lange ausgeführt haben, wie Sie Daten erfassen möchten, drücken Sie, um die Datenerfassung
Ctrl-C
zu beenden und die Ergebnisse auszugeben. Es wird so etwas produzieren:Wie Sie sehen, ist dies eine Aufschlüsselung aller von der Anwendung getätigten Systemaufrufe, sortiert nach der Gesamtzeit, einschließlich der durchschnittlichen Zeit pro Anruf und der Anzahl der Anrufe für jeden Systemaufruf. Wenn Sie sie anders sortieren möchten, lesen Sie die Manpage für strace, da es einige Optionen gibt.
quelle
Probieren Sie vielleicht einen der Sampling-Profiler aus, z. B. oprofile, oder für neuere Kernel perf. Wenn Sie Glück haben, sagt Ihnen "perf top" vielleicht genau, was Sie wollen. Sehen Sie hier einige Beispiele
quelle
Die Art von Strace-Schaltern, die ich normalerweise benutze, ist diese.
strace -ffttT -p pid -o /tmp/strace.out
Ein Beispiel dafür würde aussehen wie:
Der Zeitunterschied auf der rechten Seite des Systemaufrufs zeigt an, wie lange es gedauert hat, von einem Systemaufruf zum nächsten zu wechseln.
Sie erkennen den Zeitunterschied zwischen den Systemaufrufen. Wenn Sie also sehen, dass ein Systemaufruf einige Sekunden Abstand zum nächsten Systemaufruf hat, macht er dort ein gewisses Rauschen.
Eine andere Methode besteht darin, es mit gcore zu entleeren. Dies erfordert jedoch ein wenig Erfahrung in der Navigation durch GDB.
Wenn es sich bei dem Thread jedoch um einen Kernel-Thread handelt, können Sie ihn nicht straffen oder entleeren. In diesem Fall müssen wir etwas Komplexeres verwenden. Im RHEL5-Kernel verwenden wir oprofile. In RHEL6 verwenden wir perf. Ich bevorzuge Perf gegenüber Oprofile. Perf-Daten können mit einem grafischen Format erfasst werden, das den Systemaufruf zeigt, bei dem der maximale Prozentsatz der CPU verwendet wird.
Mit einer Testleistung sehe ich das.
Es zeigt die Kernelfunktion, in der 38% der CPU-Zeit verbracht werden. Jetzt können wir die Funktion überprüfen und sehen, was sie tut und was sie tun soll.
Mit ein paar Beispielen ist es nicht so schwer.
quelle