私のプロセスがカーネルによってプリエンプトされているかどうかと頻度をどのように確認しますか?

私のプロセスがカーネルによってプリエンプトされているかどうかと頻度をどのように確認しますか?

プログラムを分析するために、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

これは、実行中にコンテキスト切り替え(カーネル以外のプロセスへの切り替え)が発生し、your_commandCPUがカーネルコードの実行時間の54%を消費したことを示します。

特定のプロセスがCPUの関心を最大限に受けるようにすることはかなり複雑になる可能性があります。Victor Stinnerのベンチマーク設定ドキュメント問題と問題を軽減するための技術の良い概要を提供します。彼の記事は主にベンチマークに焦点を当てていますが、ほとんどは他の状況にも当てはまります。

関連情報