有沒有辦法查看每個線程產生多少上下文切換? (如果可能的話,進入和退出)在X/s中,或讓它運行並在一段時間後提供彙總數據。 (在Linux或Windows上)每個線程計數上下文切換
我發現只有工具可以爲整個操作系統或每個進程提供聚合的上下文切換號。我的程序會產生許多上下文切換(50k/s),可能很多不必要,但我不確定從哪裏開始優化,其中大部分發生在哪裏。
有沒有辦法查看每個線程產生多少上下文切換? (如果可能的話,進入和退出)在X/s中,或讓它運行並在一段時間後提供彙總數據。 (在Linux或Windows上)每個線程計數上下文切換
我發現只有工具可以爲整個操作系統或每個進程提供聚合的上下文切換號。我的程序會產生許多上下文切換(50k/s),可能很多不必要,但我不確定從哪裏開始優化,其中大部分發生在哪裏。
在最近的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腳本,用於計算在特定時間段內線程所做的自願和非自願上下文切換。我不確定這是否會達到您的目的,但我仍會發布它。
此腳本正在循環進程的所有線程,並從/proc/< process-id>/task/< thread-id>/status
開始記錄"voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches"
。我所做的一般是在性能運行開始時記錄這些計數器,並在運行結束時再次記錄,然後在性能運行期間計算差值作爲總計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秒。
dupe http://stackoverflow.com/questions/304752/how-to-estimate-the-thread-context-switching-overhead – 2010-03-14 20:38:42
我沒有在這裏看到這個問題的任何答案,這只是在那裏的子問題。 – Sarmun 2010-03-16 10:13:23