Подсчет переключений контекста на поток - PullRequest
4 голосов
/ 14 марта 2010

Есть ли способ узнать, сколько переключений контекста генерирует каждый поток? (как вход, так и выход, если это возможно) Либо в X / s, либо для запуска и выдачи агрегированных данных через некоторое время. (либо на Linux, либо на Windows)

Я нашел только инструменты, которые дают агрегированный номер переключения контекста для всей ОС или для процесса.

Моя программа делает много переключений контекста (50 кбит / с), вероятно, многое не нужно, но я не уверен, с чего начать оптимизацию, где происходит большинство из них.

Ответы [ 3 ]

2 голосов
/ 14 марта 2010

В последних системах GNU / Linux вы можете использовать SystemTap для сбора данных, которые вы хотите при каждом вызове sched_switch (). Пример schedtimes.stp, вероятно, является хорошим началом: http://sourceware.org/systemtap/examples/keyword-index.html#SCHEDULER

0 голосов
/ 01 августа 2017

У меня есть скрипт 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 секунд.

0 голосов
/ 16 декабря 2014

Linux

Я написал небольшой скрипт, чтобы увидеть подробную информацию о конкретном потоке процесса. При выполнении этого скрипта вы также можете увидеть переключение контекста.

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...