Zeichnen Sie die Zeit jedes Prozess- oder Threadkontextwechsels auf

Zeichnen Sie die Zeit jedes Prozess- oder Threadkontextwechsels auf

Ich versuche, mit einer Raspbian-Distribution auf einem Raspberry Pi eine möglichst echtzeitnahe Verarbeitung zu erreichen, um die GPIO-Pins zu manipulieren. Ich möchte ein „Gefühl“ dafür bekommen, welche Leistung ich erwarten kann.

Ich wollte dies tun, indem ich ein einfaches C-Programm schreibe, das einen Pin so schnell wie möglich wiederholt umschaltet und es mit einem Logikanalysator überwacht.

Aber vielleicht gibt es auch eine andere Möglichkeit: Sie können das obige Programm schreiben, aber einfach Kontextwechsel protokollieren, um genau zu sehen, wann dieser Thread/Prozess über einen Beispielzeitraum von, sagen wir, ein paar Sekunden die Kontrolle hat.

Diese vorherige Fragebeantwortet die Frage, wie man sehen kann, wie viele Kontextwechsel in einem bestimmten Zeitraum für einen bestimmten Prozess vorgenommen werden, aber gibt es eine Möglichkeit, den genauen Zeitpunkt der Wechsel zu protokollieren, und vielleicht für jeden Prozess, nicht nur für einen? Dies würde natürlich Mehraufwand verursachen, könnte aber trotzdem nützlich sein. Natürlich sollten die Daten im RAM gespeichert werden, um den Mehraufwand zu minimieren

Notiz an mich selbst: mögliche Lösungen:

  • Befehl zum Auflisten aller Aktionen eines Prozesses in Echtzeit
  • Hack: Lassen Sie das Programm die aktuelle Zeit wiederholt abrufen und speichern (und in einer Datei speichern, sobald das Protokoll eine bestimmte Grenze erreicht). Oder eine kleine Verbesserung, um enorme Protokolle zu vermeiden: Verwenden Sie einen Algorithmus, der aufeinanderfolgende Zeiten eliminiert, wenn sie nahe genug beieinander liegen, sodass man davon ausgehen kann, dass sie nicht durch einen anderen Prozess vorweggenommen wurden.

Antwort1

Ich habe keine Antwort, aber vielleicht finden Sie eine unter denTools, Beispiele und Ressourcengeschrieben oder aufgelistet von Brendan Gregg zum perfBefehl und Linux-Kernel ftrace und debugfs.

Auf meinem Raspberry Pi befanden sich diese Tools im Paket perf-tools-unstable. Der perfBefehl befand sich tatsächlich in /usr/bin/perf_3.16.


Interessant könnte dies seinDiskussionund KontextwechselBenchmarkvon Benoit Sigoure und demlat_ctxTest aus dem ziemlich altenAbonnierenSuite.

Möglicherweise müssen sie überarbeitet werden, damit sie auf dem Pi ausgeführt werden können. Beispielsweise tsuna/contextswitchhabe ich timectxswws.c get_iterations()sie in bearbeitet while (iterations * ws_pages * 4096UL < 4294967295UL) {und -march=native -mno-avxaus entfernt Makefile.


10 Sekunden lang auf dem Pi über SSH verwenden perf recordund gleichzeitig while sleep .1;do echo hi;donein einem anderen SSH Folgendes tun:

sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less

gibt eine Ausgabe wie diese

           sleep 29341 2703976.560357: 
         swapper     0 2703976.562160: 
    kworker/u8:2 29163 2703976.564901: 
         swapper     0 2703976.565737: 
            echo 29342 2703976.565768: 
     migration/3    19 2703976.567549: 
           sleep 29343 2703976.570212: 
     kworker/0:0 28906 2703976.588613: 
     rcu_preempt     7 2703976.609261: 
           sleep 29343 2703976.670674: 
            bash 29066 2703976.671654: 
            echo 29344 2703976.675065: 
            sshd 29065 2703976.675454: 
         swapper     0 2703976.677757: 

zeigt vermutlich an, wann ein Kontextwechselereignis stattgefunden hat und für welchen Prozess.

verwandte Informationen