Подсчет переключений контекста для каждого потока
-
19-09-2019 - |
Вопрос
Есть ли способ увидеть, сколько переключений контекста генерирует каждый поток?(как вход, так и выход, если возможно) Либо в X/s, либо позволить ему работать и через некоторое время выдавать агрегированные данные.(либо в Linux, либо в Windows)
Я нашел только инструменты, которые дают агрегированное количество переключений контекста для всей ОС или для каждого процесса.
Моя программа выполняет множество переключений контекста (50 к/с), возможно, во многих из них нет необходимости, но я не уверен, с чего начать оптимизацию и где происходит большинство из них.
Решение
В последних системах GNU/Linux вы можете использовать SystemTap для сбора нужных данных при каждом вызове sched_switch().Пример schedtimes.stp, вероятно, будет хорошим началом: http://sourceware.org/systemtap/examples/keyword-index.html#SCHEDULER
Другие советы
Линукс
Я написал небольшой скрипт, чтобы увидеть детали конкретного потока процесса.Выполнив этот скрипт, вы также можете увидеть переключение контекста.
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
Надеюсь, это поможет.
У меня есть сценарий 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 секунд.