すべてのプロセスまたはスレッドのコンテキストスイッチの時間を記録する

すべてのプロセスまたはスレッドのコンテキストスイッチの時間を記録する

私は、Raspberry Pi の Raspbian ディストリビューションを使用して、GPIO ピンを操作し、リアルタイム処理にできるだけ近づけようとしています。期待できるパフォーマンスの種類を「感じ」たいと思っています。

私は、ピンをできるだけ速く繰り返し切り替える簡単な C プログラムを作成し、それをロジック アナライザーで監視することでこれを実行しようとしていました。

しかし、おそらく別の方法があります。上記のプログラムを記述し、コンテキストスイッチをログに記録するだけで、そのスレッド/プロセスが数秒のサンプル期間にわたって正確にいつ制御するかを確認できます。

前回の質問特定のプロセスで一定期間に何回コンテキストスイッチが行われるかを確認する方法の回答ですが、スイッチの正確なタイミングを記録する方法はありますか?また、1つのプロセスだけでなく、すべてのプロセスについて記録する方法はありますか?明らかに、これはオーバーヘッドを生み出しますが、それでも役に立つ可能性があります。明らかに、オーバーヘッドを最小限に抑えるために、データはRAMに保存する必要があります。

自分へのメモ: 考えられる解決策:

  • プロセスのすべてのアクションをリアルタイムで一覧表示するコマンド
  • ハッキー: プログラムが現在の時刻を繰り返し取得して保存するようにします (ログが一定の制限に達したらファイルに保存します)。または、ログが膨大になるのを避けるためのちょっとした改善: 他のプロセスによってプリエンプトされていないと推測できるほどに時間が近い連続した時刻を削除するアルゴリズムを使用します。

答え1

私には答えはありませんが、あなたは答えを見つけるかもしれませんツール、例、リソースperfコマンドおよび Linux カーネルの ftrace と debugfsについて Brendan Gregg が記述またはリストしたもの。

私の Raspberry Pi では、これらのツールはパッケージ にありましたperf-tools-unstableperfコマンドは実際には にありました/usr/bin/perf_3.16


興味深いのはこれ議論コンテキストスイッチ基準ブノワ・シグール、そしてlat_ctxかなり古いものからのテストlmベンチスイート。

これらを Pi で実行するには、いくつかの作業が必要になる場合があります。たとえば、を にtsuna/contextswitch編集し、から を削除します。timectxswws.c get_iterations()while (iterations * ws_pages * 4096UL < 4294967295UL) {-march=native -mno-avxMakefile


Pi で ssh 経由で 10 秒間使用しperf record、同時にwhile sleep .1;do echo hi;done別の ssh で実行します。

sudo timeout -10 perf_3.16 record -e context-switches -a
sudo perf_3.16 script -f time,pid,comm | less

次のような出力が得られます

           sleep 29341 2703976.560357: 
         swapper     0 2703976.562160: 
    kworker/u8:2 29163 2703976.564901: 
         swapper     0 2703976.565737: 
            echo 29342 2703976.565768: 
     migration/3    19 2703976.567549: 
           sleep 29343 2703976.570212: 
     kworker/0:0 28906 2703976.588613: 
     rcu_preempt     7 2703976.609261: 
           sleep 29343 2703976.670674: 
            bash 29066 2703976.671654: 
            echo 29344 2703976.675065: 
            sshd 29065 2703976.675454: 
         swapper     0 2703976.677757: 

おそらく、どのプロセスに対してコンテキストスイッチイベントがいつ発生したかを示します。

関連情報