contexto Contando conmuta por hilo
-
19-09-2019 - |
Pregunta
¿Hay una manera de ver la cantidad de cambios de contexto genera cada hilo? (Tanto dentro como fuera si es posible) Ya sea en X / s, o dejar que siga y dar datos agregados después de algún tiempo. (Ya sea en Linux o en Windows)
he encontrado únicas herramientas que dan número de contexto de conmutación agregada para el sistema operativo entero o por proceso.
Mi programa hace muchos interruptores de contexto (50 k / s), probablemente mucho no es necesario, pero no estoy seguro de por dónde empezar la optimización, lugar en el que la mayor parte de los que suceda.
Solución
En los últimos sistemas GNU / Linux puede utilizar SystemTap para recoger los datos que desea en cada llamada a sched_switch (). El ejemplo schedtimes.stp es probablemente un buen comienzo: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER
Otros consejos
Linux
Escribí un pequeño script para ver los detalles de un hilo específico del proceso. Mediante la ejecución de este script se puede ver cambio de contexto también.
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
Esperamos que esto ayude.
Tengo una escritura del golpe que calcula contexto voluntaria y no voluntaria interruptores hecha de un hilo durante un período de tiempo específico. No estoy seguro de si esto va a servir a su propósito, pero lo voy a publicar de todos modos.
Este script es un bucle sobre todos los hilos de un proceso de grabación y "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches"
de /proc/< process-id>/task/< thread-id>/status
. Lo que hago generalmente es registrar estos contadores en el inicio de una carrera de rendimiento y grabar de nuevo al final de la carrera y luego calcular la diferencia como interruptores totales vol & non-vol
ctx durante la ejecución de rendimiento.
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
guión es poco pesado, en mi proceso de caso tiene alrededor de 2500 hilos. El tiempo total para recoger los interruptores ctx es de alrededor de 10 segundos.