Вопрос

Есть ли способ увидеть, сколько переключений контекста генерирует каждый поток?(как вход, так и выход, если возможно) Либо в 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 секунд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top