特定の実行期間中にリアルタイムのパフォーマンスを必要とする組み込みアプリケーションに取り組んでいます。
への呼び出しで、アプリケーションの優先度を約 150 ミリ秒エスカレートします。
sched_setscheduler( 0, SCHED_FIFO, &s ) ここで、s.sched_priority = sched_get_priority_max(SCHED_FIFO) であり、99 を返します。
その後、次の呼び出しでアプリケーションのスケジューリング優先度を下げます
sched_setscheduler( 0, SCHED_OTHER, &s ) ここで、s.sched_priority = sched_get_priority_min(SCHED_OTHER) です。
このスケジューラの優先順位のエスカレーション/エスカレーション解除は、1 秒ごとに発生します。
断続的なリアルタイムの締め切りに間に合わないことが、アプリケーション内で明らかになりました。スケジューラーをプロファイリングして、リアルタイム実行期間がプリエンプトされているかどうかを判断したいと考えています。
perf sched record -r 99 -R ./test_app
[パフォーマンス レコード: データを書き込むために 9 回起きた] [パフォーマンス レコード: 10.272 MB の perf.data (~448808 サンプル) をキャプチャして書き込みました]
私が探しているのは、99 の優先度値を参照して、私のアプリケーションに関連付けられた sched_switch イベントです。私のアプリケーションは優先度を n 回エスカレートする必要があると判断できるため、そのようなイベントが n 個以上見つかった場合、それは実行のリアルタイム部分がプリエンプトされていることを意味します。
次のコマンドを使用すると、大量のスケジューラ データが stdout に送信されます。
パフォーマンス スケジュール トレース | grep test_app | grep sched_switch
次のように優先度 99 に言及しているスケジューラ切り替えイベントを見つけることを期待していました。
パフォーマンス スケジュール トレース | grep test_app | grep sched_switch | grep prio=99
それでも、上記のコマンドは何も返しません。
perf バージョン 0.0.2.PERF を使用しています。perf の動作または使用に関して間違った仮定をしていませんか? もしそうなら、Linuxリアルタイムスケジューラのプロファイリングに代わる正しい使用法またはその他の方法を提案してください。