У меня есть скрипт bash, который вычисляет произвольные и недобровольные переключения контекста, сделанные потоком в течение определенного периода времени. Я не уверен, послужит ли это вашей цели, но я все равно выложу.
Этот скрипт зацикливается на всех потоках процесса и записывает "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches"
из /proc/< process-id>/task/< thread-id>/status
. Обычно я записываю эти счетчики в начале прогона производительности и снова записываю в конце прогона, а затем вычисляю разницу как общее число переключателей vol & non-vol
ctx во время прогона производительности.
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
Скрипт немного тяжел, в моем случае процесс имеет около 2500 потоков. Общее время сбора переключателей ctx составляет около 10 секунд.