每个线程计数上下文切换
-
19-09-2019 - |
题
有一种方法看上下文多少开关,每个线程生成? (在国内外享有如果可能的话),无论是在X / S,或让它运行,并在一段时间后得到汇总数据。 (无论是在Linux或Windows)
我发现仅得到聚合的上下文切换的编号为整个操作系统或每个进程的工具。
我的程序使得许多上下文切换(50K /秒),可能是没有必要的很多,但我不知道从哪里开始优化,在哪里那些最发生。
解决方案
在最近的GNU / Linux系统可以使用的SystemTap收集在每次调用你想要的数据sched_switch()。该schedtimes.stp例子可能是一个良好的开端: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER
其他提示
的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
希望这会有所帮助。
我有一个特定的时间帧期间计算自愿和非自愿上下文切换由一个线程制成的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秒左右。
不隶属于 StackOverflow