web-dev-qa-db-ja.com

LinuxはTLBにx86CPUのPCID機能を使用しますか?そうでない場合、なぜですか?

CR4.PCIDEをチェックするカーネルモジュールを作成しましたが、設定されていません。 Linuxがこのような機能を使用してTLBの無効化とキャッシュの汚染によるパフォーマンスの低下を軽減しないのはなぜですか?

26
W.Sun

更新:これは、2017年後半から2018年初頭にかけて メルトダウン攻撃とスペクター攻撃 のため、4.15の時間枠で変更されました。-を参照してください。 他の答え 詳細については。

注:私はLinux開発者ではありません

Intelの「ProcessContextIdentifiers」の場合、4096IDの制限があります。これは、4096を超えるプロセスがある場合、それらを管理する必要があることを意味します(たとえば、「最近使用されていない」ことを実行して、現在IDを持たないプロセスを実行する必要がある場合、IDは一部から取得されます。他のプロセスと再利用)。

もう1つは、マルチCPUシステムでの「TLBシュートダウン」です。これらは少し高価になる可能性があるので、人々はそれらを避けるためにトリックをします。たとえば、プロセスにスレッドが1つしかない場合、そのプロセスは1つのCPUでのみ実行でき、他のCPUにIPIを送信する必要がないことがわかります(CPUを中断し、「TLBシュートダウン」を実行するように要求します)。 PCIDの使用を開始すると、他のCPUにTLBエントリがまだないことを確認できず、「TLBシュートダウン」を回避するためにこれらのトリックを実行できません。また、(理論的には、PCIDサポートが適切に実装されていない場合)PCIDから得られるパフォーマンスは、回避されないTLBシュートダウンとID管理オーバーヘッドのために失うパフォーマンスよりも低くなり、純損失が発生する可能性があることも意味します。

私が言っていることのほとんどは、PCIDのサポートを追加するのは少し複雑だということです(CR4でフラグを設定してそれを忘れることができるわけではありません)。それを実装する最も効果的な方法を決定するには、いくつかの調査(実験、プロトタイプ、ベンチマーク)を行う必要があります。大規模/複雑/古いカーネル(Linuxなど)の場合、誤って他の何かを混乱させないように注意する必要があるため、さらに複雑になります。もう1つは、この機能は比較的新しく(正しく覚えていれば数年しか存在しません)、多くのCPU(たとえば、少し古いものやAMDのもの)ではサポートされていないことです。

基本的には、「時間とメリット」(または、限られた数のCPUでパフォーマンスを少し向上させるのに十分な時間ではない)に帰着すると思います。

25
Brendan

はい! Linuxカーネルの最近のバージョンではPCIDがサポートされています。この質問が行われた時点では、このサポートは存在しませんでしたが、2017年の終わり近くに-から始まるように追加されました。 4.14カーネル 。元のパッチの議論のいくつかに従うことができます このLKMLチェーン内

数が限られているため、変更によって実際にはプロセスごとに一意のPCIDが関連付けられたり、頻繁に使用される基準に割り当てられたりすることはありませんが、CPUごとにPCIDキャッシュが使用されるため、特定のCPUで複数のプロセスが実行されている可能性があります。 PCIDメカニズムを使用してTLBフラッシュオーバーヘッドを回避できるようにするため。

一連の脆弱性 が見つかったため、これは最近より関連性が高くなりました。これにより、非特権ユーザーコードがカーネルメモリを読み取ることができ、 KPTIパッチ が展開されました。ユーザーレベルのTLBエントリはカーネル呼び出しで無効になる可能性があるため、これらのパッチはパフォーマンスに大きな影響を与える可能性があります。 PCIDのサポートにより、ユーザーレベルのTLBエントリが保持されるため、影響が軽減されます。


リリースされたカーネルでPCIDサポートが利用できなかったときに、この回答の古いバージョンが以下にあります。

まだですが、何かが進行中のようです。 LKMLの このあたり で始まるスレッドを参照してください。特に、クロスコアTLBシュートダウンの問題に対する解決策が提案されています。

非現在のPCIDのTLBシュートダウンを受信するときに、そのPCIDのすべてのエントリをフラッシュし、mmのcpu_vm_mask_varからCPUを削除した場合、非現在のmmに対して複数のシュートダウンIPIを受信することはありませんが、たとえば、TLBの寿命のメリットを引き続き享受できます。タスクが交互に同じCPUで実行されるパイプワークロード。

そのスレッドから、アドレス空間識別子が他のLinuxアーキテクチャで長い間使用されてきたことを収集することもできます。

15
BeeOnRope