contexte de comptage passe par thread
-
19-09-2019 - |
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.
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.