Linuxカーネル構成時のRCUの理解

Linuxカーネル構成時のRCUの理解

Linuxカーネルバージョン3.9.4を構成しています。 RCUについて質問がありました(下記参照)。具体的には、それぞれが何であり、一部を有効または無効にすることの利点と欠点は何ですか?

Consider userspace as in RCU extended quiescent state (RCU_USER_QS) [N/y/?]
Tree-based hierarchical RCU fanout value (RCU_FANOUT) [64]
Disable tree-based hierarchical RCU auto-balancing (RCU_FANOUT_EXACT) [N/y/?]
Accelerate last non-dyntick-idle CPU's grace periods (RCU_FAST_NO_HZ) [Y/n/?]
Offload RCU callback processing from boot-selected CPUs (RCU_NOCB_CPU) [N/y/?] 

ベストアンサー1

これらのオプションの詳細については、次を参照してください。LTTngプロジェクト場所。 RCUは(読み取り - コピー - 更新)です。これは、同じデータがマルチコアCPUのコア全体にレプリケートされ、コピー間でデータが同期されたままになることを保証するカーネル内のデータ構造です。

抜粋

liburcuはLGPLv2.1ユーザースペースRCU(読み取り - コピー - 更新)ライブラリです。このデータ同期ライブラリは、コア数に応じて線形に拡張される読取り側アクセスを提供します。これは、特定のデータ構造の複数のコピーが同時に存在することを可能にし、データ構造へのアクセスを監視し、メモリ回収が発生する可能性がある猶予期間を検出することによってこれを実行します。

リソース

それでは、これらのオプションは何ですか?

このオプションは、カーネル/ユーザー空間の境界にフックを設定し、CPUがユーザー空間で実行されている間にRCUを拡張静的状態に切り替えます。これは、CPU がユーザ空間で動作しているときにグローバル RCU 状態システムから除外されるため、RCU のタイマを開いたままにしようとしないことを意味します。

完全なダイナミクスモードをハッキングして開発するのを助ける必要がない限り、このオプションを有効にしないでください。また、不要なオーバーヘッドも追加されます。

わからない場合はNと言ってください

このオプションは、RCU層実装のファンアウトを制御し、RCUが多数のCPUを搭載したシステムで効率的に動作できるようにします。値は少なくともNR_CPUSの4番目のルートでなければなりません。これにより、NR_CPUSが非常に大きくなる可能性があります。 RCU_FANOUTのデフォルト値は本番システムで使用する必要がありますが、RCU実装自体をストレステストする場合は、より小さいRCU_FANOUT値を使用して、小規模システムで大規模システムコードパスをテストできます。

RCU自体をテストする場合は、特定の番号を選択してください。わからない場合は、デフォルト値を使用してください。

このオプションは、階層の不均衡に関係なく、指定された正確なRCU_FANOUT値を強制します。これはRCU自体をテストするのに役立ち、いつか強力なNUMA動作を持つシステムに役立ちます。

RCU_FANOUT_EXACT がない場合、コードは階層のバランスをとります。

よくわからない場合は、Nと言ってください。

このオプションを使用すると、CPUはRCUコールバックがキューにある場合でもdynticks-idle状態に入り、RCUが約4ジップごとに一度これらのCPUを起動するのを防ぎます(デフォルトではrcutree.rcu_idle_gp_delayパラメータを使用して設定を調整できます)。エネルギー効率。一方、このオプションはRCU猶予期間の期間を長くします。たとえば、同期_rcu()が遅くなります。

エネルギー効率が重要で猶予期間の延長が心配されない場合は、「はい」を選択してください。

よくわからない場合は、Nを選択してください。

積極的なHPCまたはリアルタイムワークロードのオペレーティングシステムジッタを減らすには、このオプションを使用します。また、バッテリ駆動の非対称マルチプロセッサからエネルギー効率の高いCPUへのRCUコールバックコールのオフロードにも使用できます。

このオプションは、起動時にrcu_nocbsパラメータで指定されたCPUからコールバック呼び出しを集中的にオフロードします。これらのCPUごとにコールバックを呼び出すためにkthread( "rcuox / N")が生成されます。ここで、「N」はオフロードされるCPU、「x」はRCU-bhの場合は「b」、「p」はRCUを意味する。プリエンプション「s」はRCUスケジューリングを表します。このkthreadが指定されたCPUで実行されるのを防ぐ方法はありませんが、(1)kthreadは各コールバックの間でプリエンプションでき、(2)アフィニティまたはcgroupを使用してkthreadが必要なCPUセットで実行されるように強制できます。

デバッグを支援し、オペレーティングシステムのジッタを減らすには、ここでYと言います。わからない場合は、ここからNを選択してください。

それで、あなたはそれを必要としますか?

カーネルをコンパイルするときに特定のオプションが何をしているのかわからない場合は、そのオプションがなくても購入できるのは安全です。だから私はその質問にいいえと答えます。

また、この種のタスクを実行するときは、通常、ディストリビューションで使用されているカーネルの構成ファイルをインポートして比較して、欠落している機能があるかどうかを確認します。これはおそらくすべての機能を学ぶのに最適なリソースです。

たとえば、Fedoraでは、埋め込みサンプル構成を参照できます。詳しくはこのページをご覧ください。カスタムカーネルの構築

おすすめ記事