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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top