2017-02-14 2 views
1

auf Linux, einen Prozess (Haupt-Thread des) letzten Programm-Zählerwert wird in /proc/$PID/stat dargestellt. Dies scheint ein wirklich einfacher und einfacher Weg zu sein, um einige gesamplete Profiling zu machen, ohne ein Programm in irgendeiner Weise instrumentieren zu müssen. JedochVerwenden/proc/*/stat zum Profilieren

Ich frage mich, ob dies irgendwelche Einschränkungen, wenn es um die Sampling-Qualität geht. Ich gehe davon aus, dass dieser Wert aktualisiert wird, wenn der Prozess aus seiner Zeitscheibe, die sollte in völlig zufälligen Abständen im Programmcode passieren, und dass Stichproben genommen mehr als Zeitscheibe Länge sollte gleichmäßig verteilt nach wo verteilt werden das Programm verbringt tatsächlich seine Zeit. Aber das ist nur eine Annahme, und mir ist klar, dass es in vielerlei Hinsicht falsch sein könnte.

Weiß jemand?

Antwort

-1

Wenn es funktioniert, was es kann, wird er die Mängel des prof hat, die gprof sollte Abhilfe zu schaffen. Dann hat gprof seine eigene shortcomings, die zu zahlreichen moderneren Profilern geführt haben. Einige von uns betrachten this, um am effektivsten zu sein, und es kann mit einem so einfachen Werkzeug wie pstack oder lsstack erreicht werden.

+1

Oh, ich sehr einverstanden, dass die manuelle Probenahme mit einem Debugger ist oft die schönste, aber mein Problem ist, dass ich ein Soft-Realtime-Programm mit LLVM-JITted Code zum Profil bin versucht, die GDB führt zu nehmen ~ 1 Sekunde anhängen (um die JIT-generierten Symboltabellen zu lesen), wodurch die Echtzeitbeschränkungen aufgehoben werden. Daher versuche ich, verschiedene Wege zu finden, um es zu probieren. :) – Dolda2000

+0

@ Dolda2000: Gedanken: 1) Kannst du die ganze Sache unter einem Debugger laufen lassen, also bezahlst du die Symboltabelle einmal im Voraus? 2) Kannst du es glatt laufen lassen und nicht auf äußere Ereignisse warten?- Wenn sich darin Verschwendungen verbergen, sollte dies offen gelegt werden. 3) Meiner Erfahrung nach ist es egal, wie viel Zeit es braucht * nachdem * ich es unterbrochen habe. Ich kann den ganzen Tag dauern, um es zu studieren. Es kommt darauf an, dass der Interrupt selbst zu einem Zeitpunkt auftritt, der für das Programm unvorhersehbar ist, so dass die Verschwendung in dem Maße erkannt wird, wie es Zeit braucht. –

+0

Alles andere beiseite, ich möchte nur sagen, dass ich an einer tatsächlichen Antwort auf die Frage interessiert wäre, da dies mir helfen würde zu entscheiden, wann und in welchen Situationen der EIP-Wert von '/ proc/*/stat' sein könnte nützlich sein. Aber ja, wie für 1) und 3) ist das Problem dann, dass die Zeit für mich, das Programm zu unterbrechen, den Stacktrace auszudrucken und es dauert auch etwa eine Sekunde (der Vorteil des Aufrufs 'gdb' ist neu, dass ich geben kann es '-Batch -ex' Optionen). Wenn es einen Weg gibt, das zu ändern, wäre das auch sehr interessant. Wie für 2), muss ich das Programm "in Produktion" ausführen, damit die Ergebnisse sinnvoll sind. – Dolda2000

1

Warum nicht modern builtin Linux-Tools wie perf (https://perf.wiki.kernel.org/index.php/Main_Page) zu versuchen?

Es hat record Modus mit einstellbarer Frequenz (-F100 für 100 Hz), mit vielen Veranstaltungen, beispielsweise auf Softwareereignis task-clock ohne Hardware-Leistungszähler verwendet (stoppen die perf mit Ctrl-C oder fügen sleep 10 nach rechts Probe für 10 Sekunden):

perf record -p $PID -e task-clock -o perf.output.file 

Perf für alle Threads ohne Instrumentierung (Neukompilierung oder Code-Bearbeitung) und wird nicht stören Programmausführung arbeitet (nur Timer-Interrupt wird leicht modifiziert). (Es gibt auch eine gewisse Unterstützung von Stacktrace Sampling mit -g Option.)

Ausgabe kann offline analysiert werden mit perf report (nur diesen Befehl wird versuchen, binäre und gemeinsam genutzte Bibliotheken zu analysieren)

perf report -i perf.output.file 

oder roh PC umgewandelt (EIP) -Proben mit perf script -i perf.output.file.

PS: EIP-Zeiger in/proc/$ pid/stat-Datei wird in offiziellen Linux-Man Seite 5 Proc http://man7.org/linux/man-pages/man5/proc.5.html als kstkeip - "Die aktuelle EIP (Anweisungszeiger)" erwähnt. Es ist unter fs/proc/array.c:do_task_stateip = KSTK_EIP(task); gelesen, aber ich bin nicht sicher, wo und wann es gefüllt ist. Es kann auf Task-Schalter geschrieben werden (sowohl beim unfreiwilligen Ende von taskslice als auch freiwillig, wenn Tasks so etwas wie sched_yield machen) oder beim Blockieren von syscalls, daher ist es wahrscheinlich nicht die beste Wahl als Sampling-Quelle.

+0

Ich entdeckte tatsächlich 'perf record' und benutzte es zu etwas Erfolg (wie in den Kommentaren zu Mikes Antwort erwähnt), und ich baute auch ein einfaches C-Programm, das' libunwind' verwendet, um sehr schnell einen vollständigen StackTrace zu erhalten aus einem laufenden Prozess. Allerdings verstehe ich nicht ganz, auf welcher Grundlage Sie schließen, dass die Informationen "/ proc/*/stat" suboptimal sind. – Dolda2000

+0

Ich habe keine genaue Idee, wenn das "ip" -Feld von '/ proc/*/stat' aktualisiert wird; es kann eine hohe systematische Tendenz zu blockierenden Systemaufrufen geben. Es ist auch in der Zeitauflösung begrenzt (ungefähr 100 Aktualisierungen pro Sekunde), wenn "perf" standardmäßig Ereignisse so häufig wie 2-4 kHz erlauben kann (gut für kurz laufende Programme). Welche Art von Zugriff haben Sie mit libunwind, ptrace verwendet? – osgx

+0

Ich denke, es könnte eine solche Voreingenommenheit geben, aber aus dem, was wir bisher wissen, sehe ich nichts, was darauf hindeutet, dass es da ist, oder fehle ich etwas? Und ja, ich habe ptrace mit libunwind benutzt. – Dolda2000

Verwandte Themen