4

各スレッドが生成するコンテキスト スイッチの数を確認する方法はありますか? (可能であればインとアウトの両方) X/s で実行するか、実行してしばらくしてから集計データを取得します。(LinuxまたはWindowsのいずれか)

OS全体またはプロセスごとに集計されたコンテキスト切り替え数を提供するツールのみを見つけました。

私のプログラムは多くのコンテキスト切り替え (50k/s) を行いますが、おそらくそれほど多くは必要ありませんが、どこから最適化を開始すればよいのか、それらのほとんどがどこで行われるのかわかりません。

4

3 に答える 3

2

最近の GNU/Linux システムでは、SystemTap を使用して、sched_switch() を呼び出すたびに必要なデータを収集できます。schedtimes.stp の例はおそらく良いスタートです: http://sourceware.org/systemtap/examples/keyword-index.html#SCHEDULER

于 2010-03-14T20:45:01.403 に答える
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

これが役立つことを願っています。

于 2014-12-16T00:14:26.657 に答える
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 秒です。

于 2017-07-31T21:01:55.310 に答える