Frage

Gibt es eine Möglichkeit, um zu sehen, wie viele Kontextumschaltungen jeden Thread erzeugt? (Beide in und aus, wenn möglich) entweder in X / s, oder lassen Sie ihn laufen und geben aggregierte Daten nach einiger Zeit. (Entweder auf Linux oder Windows)

Ich habe nur Werkzeuge gefunden, die kontextSchaltNummer für ganze os oder pro Prozess aggregiert geben.

Ihr Programm macht viele Kontextwechsel (50k / s), wahrscheinlich eine Menge nicht notwendig, aber ich bin nicht sicher, wo die Optimierung zu starten, wo die meisten von denen passieren.

War es hilfreich?

Lösung

Auf den letzten GNU / Linux-Systeme können Sie SystemTap verwenden, um die Daten zu sammeln Sie bei jedem Aufruf zu sched_switch mögen (). Das schedtimes.stp Beispiel ist wahrscheinlich ein guter Anfang: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER

Andere Tipps

Linux

Ich habe ein kleines Skript, um die Details eines bestimmten Thread des Prozesses zu sehen. Durch die Ausführung dieses Skripts können Sie Kontextwechsel als auch sehen.

if [ "$#" -ne 2 ]; then
    echo "INVALID ARGUMENT ERROR: Please use ./see_thread.sh processName threadNumber"
    exit
fi
ls /proc/`pgrep $1`/task | head -n$2 | tail -n+$2>temp
cat /proc/`pgrep $1`/task/`cat temp`/sched

Hope dies dazu beitragen wird.

Ich habe einen Bash-Skript, die freiwilligen und unfreiwilligen Kontext berechnet schaltet von einem Thread während eines bestimmten Zeitrahmen. Ich bin mir nicht sicher, ob dies Ihren Zweck dienen, aber ich werde es trotzdem posten.

Dieses Skript wird Schleifen über alle Threads eines Prozesses und die Aufnahme "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches" von /proc/< process-id>/task/< thread-id>/status. Was ich tue, ist in der Regel diese Zähler zu Beginn eines Leistungslauf aufnehmen und wieder am Ende des Laufs aufzeichnen und dann berechnen Differenz als Gesamt vol & non-vol ctx während der Aufführung Lauf schaltet.

pid=`ps -ef | grep <process name> | grep $USER | grep -v grep | awk '{print $2}'`
echo "ThreadId;Vol_Ctx_Switch;Invol_Ctx_Switch"
for tid in `ps -L --pid ${pid}  | awk '{print $2}'`
do
    if [ -f /proc/$pid/task/$tid/status ]
    then
        vol=`cat /proc/$pid/task/$tid/status | grep voluntary_ctxt_switches | grep -v nonvoluntary_ctxt_switches | awk '{print $NF}'`
        non_vol=`cat /proc/$pid/task/$tid/status | grep nonvoluntary_ctxt_switches | awk '{print $NF}'`
    fi
    echo "$tid;$vol;$non_vol"
done

Script ist etwas schwer, in meinem Fall Prozess hat rund 2500 Threads. Insgesamt benötigte Zeit zu sammeln ctx Schalter ist etwa 10 Sekunden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top