
プログラムをプロファイリングするために、1 つの CPU で中断なく実行したいと思います。これを行うには、taskset
との組み合わせを使用しますchrt
。
# taskset -c 1 chrt -f 99 ./my_program
ここでの私の質問は、プロセスがカーネルへのコンテキストスイッチによって中断されるかどうか、またその頻度を確認できるツールがあるかどうかです。
答え1
使用できますperf
; 例えば、
perf stat -e context-switches,cpl_cycles.ring0,cpl_cycles.ring123 your_command
次のような要約が生成されます
Performance counter stats for 'your_command':
1 context-switches
11,890,096 cpl_cycles.ring0
9,980,265 cpl_cycles.ring123
0.011218937 seconds time elapsed
0.007533000 seconds user
0.003766000 seconds sys
これは、の実行中にコンテキスト スイッチ (カーネルではなく別のプロセスへの) が 1 回発生しyour_command
、CPU がカーネル コードの実行に 54% の時間を費やしたことを示しています。
特定のプロセスが CPU の注意を可能な限り多く得るようにすることは、非常に複雑になる可能性があります。Victor Stinner のベンチマーク設定ドキュメント問題の概要と、問題を軽減するテクニックをわかりやすく説明しています。彼の記事はベンチマークに重点を置いていますが、その多くは他の状況にも適用できます。