16.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ファイルに渡すことで、スロットルを無効にできます。
-