4

有沒有辦法查看每個線程產生多少上下文切換? (如果可能的話,進入和退出)在X/s中,或讓它運行並在一段時間後提供彙總數據。 (在Linux或Windows上)每個線程計數上下文切換

我發現只有工具可以爲整個操作系統或每個進程提供聚合的上下文切換號。我的程序會產生許多上下文切換(50k/s),可能很多不必要,但我不確定從哪裏開始優化,其中大部分發生在哪裏。

+0

dupe http://stackoverflow.com/questions/304752/how-to-estimate-the-thread-context-switching-overhead – 2010-03-14 20:38:42

+1

我沒有在這裏看到這個問題的任何答案,這只是在那裏的子問題。 – Sarmun 2010-03-16 10:13:23

回答

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 

希望這會有所幫助。

0

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