3.14. RCU コールバックのオフロード
Read-Copy-Update (RCU) システムは、カーネル内で相互に除外されるロックレスメカニズムです。RCU 操作を実施することで、メモリーを安全に削除する際に、将来実行される CPU にコールバックがキューに置かれることがあります。
RCU コールバックは
rcu_nocbs
および rcu_nocb_poll
カーネルパラメーターを使用してオフロードできます。
- RCU コールバックを実行する候補から 1 つ以上の CPU を削除するには、
rcu_nocbs
カーネルパラメーターの CPU の一覧を指定します。以下に例を示します。rcu_nocbs=1,4-6
またはrcu_nocbs=3
2 つ目の例では、CPU 3 が no-callback CPU であることをカーネルに指示します。つまり、RCU コールバックは CPU 3 に固定されたrcuc/$CPU
スレッドでは実行されませんが、rcuo/$CPU
スレッドでは、ハウスキーピング CPU に移動して、RCU コールバックジョブの実行から CPU 3 を解放できます。RCU コールバックスレッドをハウスキーピング CPU に移動するには、tuna -t rcu* -c X -m
コマンドを使用します。X はハウスキーピング CPU を示します。たとえば、CPU 0 がハウスキーピング CPU のシステムでは、以下のコマンドを使用してすべての RCU コールバックスレッドを CPU 0 に移動できます。~]#
tuna -t rcu* -c 0 -m
これは、CPU 0 以外のすべての CPU が RCU の動作に依存します。 - RCU オフロードスレッドは別の CPU で RCU コールバックを実行できますが、各 CPU は対応する RCU オフロードスレッドを実行します。RCU オフロードスレッドを発生させる責任から各 CPU を利用するには、
rcu_nocb_poll
カーネルパラメーターを設定します。rcu_nocb_poll
rcu_nocb_poll
が設定されている場合は、RCU オフロードスレッドがタイマーによって定期的に発生し、実行するコールバックがあるかどうかを確認します。
以下の 2 つのオプションに対する一般的なユースケースは以下のとおりです。
rcu_nocbs=cpulist
を使用して、すべての RCU オフロードスレッドをハウスキーピング CPU に移動できます。- 各 CPU を RCU オフロードスレッドを解除する役割から解放するために
rcu_nocb_poll
を設定。
この組み合わせにより、ユーザーのワークロードに特化した CPU への干渉が軽減されます。
リアルタイムでの RCU チューニングの詳細は、Avoiding RCU Stalls in the real-time kernel を参照してください。