プロセスがカーネルによってプリエンプトされているかどうか、またその頻度を確認するにはどうすればよいでしょうか?

プロセスがカーネルによってプリエンプトされているかどうか、またその頻度を確認するにはどうすればよいでしょうか?

プログラムをプロファイリングするために、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 のベンチマーク設定ドキュメント問題の概要と、問題を軽減するテクニックをわかりやすく説明しています。彼の記事はベンチマークに重点を置いていますが、その多くは他の状況にも適用できます。

関連情報