计算每个线程的上下文切换

时间:2010-03-14 20:30:49

标签: performance optimization operating-system context-switch

有没有办法看到每个线程生成多少个上下文切换? (如果可能,输入和输出)在X / s中,或者让它运行并在一段时间后提供聚合数据。 (无论是在Linux上还是在Windows上)

我发现只有工具可以为整个操作系统或每个进程提供聚合的上下文切换编号。

我的程序进行了许多上下文切换(50k / s),可能没有必要,但我不知道从哪里开始优化,大多数情况发生在哪里。

3 个答案:

答案 0 :(得分:2)

在最近的GNU / Linux系统上,您可以使用SystemTap在每次调用sched_switch()时收集所需的数据。 schedtimes.stp示例可能是一个好的开始:http://sourceware.org/systemtap/examples/keyword-index.html#SCHEDULER

答案 1 :(得分:0)

的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

希望这会有所帮助。

答案 2 :(得分:0)

我有一个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秒。