35.3. リアルタイムカーネルでのスレッド枯渇
スレッドスタベーションは、スレッドがスタベーションしきい値よりも長く CPU 実行キューにあり、進行しない場合に発生します。スレッドスターベーションの一般的な原因は、CPU にバインドされた SCHED_FIFO
や SCHED_RR
など、固定優先度のポーリングアプリケーションを実行することです。ポーリングアプリケーションは I/O をブロックしないため、kworkers
などの他のスレッドがその CPU で実行されなくなる可能性があります。
スレッドスタベーションを減らすための初期の試みは、リアルタイムスロットリングと呼ばれます。リアルタイムスロットリングでは、各 CPU に非リアルタイムタスク専用の実行時間の一部があります。スロットリングのデフォルト設定はオンであり、CPU の 95% がリアルタイムタスク用に割り当てられ、5% がリアルタイム以外のタスク用に予約されます。これは、1 つのリアルタイムタスクが原因でスタベーションが発生している場合には機能しますが、CPU に複数のリアルタイムタスクが割り当てられている場合には機能しません。以下を使用して問題を回避できます。
stalld
機能stalld
機能は、リアルタイムスロットリングの代替手段であり、スロットリングの欠点の一部を回避します。stalld
は、システム内の各スレッドの状態を定期的に監視するデーモンであり、指定された時間、実行されずに、実行キューにあるスレッドを探します。stalld
は、SCHED_DEADLINE
ポリシーを使用するようにそのスレッドを一時的に変更し、指定された CPU でスレッドにわずかな時間を割り当てます。次にスレッドが実行され、タイムスライスが使用されると、スレッドは元のスケジューリングポリシーに戻り、stalld
はスレッドの状態を監視し続けます。ハウスキーピング CPU は、すべてのデーモン、シェルプロセス、カーネルスレッド、割り込みハンドラー、および分離された CPU からディスパッチできるすべての作業を実行する CPU です。リアルタイムスロットリングが無効になっているハウスキーピング CPU の場合、
stalld
はメインワークロードを実行する CPU を監視し、その CPU にSCHED_FIFO
ビジーループを割り当てます。これは、停止したスレッドを検出し、事前に定義された許容可能な追加ノイズを使用して、必要に応じてスレッドの優先度を向上させるのに役立ちます。リアルタイムのスロットリング機能によってメインワークロードに不当なノイズが発生する場合は、stalld
が優先される可能性があります。stalld
を使用すると、不足しているスレッドをブーストすることによって導入されるノイズをより正確に制御できます。シェルスクリプト/usr/bin/throttlectl
は、stalld
の実行時にリアルタイムスロットリングを自動的に無効にします。/usr/bin/throttlectl show
スクリプトを使用して、現在のスロットル値を一覧表示できます。- リアルタイムスロットリングの無効化
/proc
ファイルシステムの次のパラメーターは、リアルタイムスロットリングを制御します。-
/proc/sys/kernel/sched_rt_period_us
パラメーターは、期間のマイクロ秒数を指定します。デフォルトは 100 万、つまり 1 秒です。 -
/proc/sys/kernel/sched_rt_runtime_us
パラメーターは、スロットリングが発生する前にリアルタイムタスクで使用できるマイクロ秒数を指定します。デフォルトは 950,000、つまり使用可能な CPU サイクルの 95% です。echo -1 > /proc/sys/kernel/sched_rt_runtime_us
コマンドを使用して、値-1
をsched_rt_runtime_us
ファイルに渡すことで、スロットルを無効にできます。
-