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 つのオプションに対する一般的なユースケースは以下のとおりです。
  1. rcu_nocbs=cpulist を使用して、すべての RCU オフロードスレッドをハウスキーピング CPU に移動できます。
  2. 各 CPU を RCU オフロードスレッドを解除する役割から解放するために rcu_nocb_poll を設定。
この組み合わせにより、ユーザーのワークロードに特化した CPU への干渉が軽減されます。
リアルタイムでの RCU チューニングの詳細は、Avoiding RCU Stalls in the real-time kernel を参照してください。