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 perf
Befehl und Linux-Kernel ftrace und debugfs.
Auf meinem Raspberry Pi befanden sich diese Tools im Paket perf-tools-unstable
. Der perf
Befehl 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/contextswitch
habe ich timectxswws.c
get_iterations()
sie in bearbeitet while (iterations * ws_pages * 4096UL < 4294967295UL) {
und -march=native -mno-avx
aus entfernt Makefile
.
10 Sekunden lang auf dem Pi über SSH verwenden perf record
und gleichzeitig while sleep .1;do echo hi;done
in 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.