Question

Est-il possible de voir combien de changements de contexte chaque thread génère? (À la fois et si possible) soit dans X / s, ou de le laisser fonctionner et donner des données agrégées après un certain temps. (Soit sous Linux ou sous Windows)

Je l'ai trouvé que des outils qui donnent le numéro de contexte de commutation agrégée pour os entier ou par processus.

Mon programme fait beaucoup de changements de contexte (50k / s), probablement beaucoup pas nécessaire, mais je ne suis pas sûr où commencer l'optimisation, où faire la plupart des personnes se produisent.

Était-ce utile?

La solution

Sur récents systèmes GNU / Linux, vous pouvez utiliser SystemTap pour recueillir les données que vous voulez sur chaque appel à sched_switch (). L'exemple de schedtimes.stp est probablement un bon départ: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER

Autres conseils

Linux

J'ai écrit un petit script pour voir les détails d'un fil spécifique du processus. En exécutant ce script, vous pouvez voir changement de contexte ainsi.

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

Espérons que cela vous aidera.

J'ai un script bash qui calcule le contexte volontaire et non volontaire Conduites par un fil pendant un laps de temps spécifique. Je ne suis pas sûr que cela servira votre but, mais je vais le poster de toute façon.

Ce script est en boucle sur tous les threads d'un processus d'enregistrement et de "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches" /proc/< process-id>/task/< thread-id>/status. Ce que je fais est généralement enregistrer ces compteurs au début d'une course de performance et d'enregistrer à nouveau à la fin de la course et ensuite calculer la différence en tant que commutateurs total CTX vol & non-vol pendant la course de performance.

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 est peu lourd, dans mon processus de cas a environ 2500 threads. Le temps total pour recueillir les commutateurs CTX est d'environ 10 secondes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top