2番目の(ハイパースレッド)仮想コアが最大化されるように予約されていない間に、優先順位の高いプロセス/スレッドが物理プロセッサコアで実行されるようにする方法(Linuxカーネルオプション、sysctl設定、または設定可能なスケジューラモジュール)はありますか?合計クロックシステムのスループットを最大化するために競合状態を回避し、L1キャッシュを共有せず、最大CPUクロック(Turbo Boost)を使用し、同時に低CPUクロック/スレッドを使用する他の物理コアの2つの仮想コアで優先度の低いプロセスを実行してパフォーマンスを大幅に向上させます。 ?
言い換えれば:優先順位に従ってハイパースレッディングを動的に無効にできますか?
CPUがプロセス/スレッド優先順位を使用してハイパースレッドコアの2つのスレッドのうち、競合状態で先に進むことができるスレッドを決定した場合、Linuxカーネルは優先順位の高いプロセス/スレッドのみを一致させるようにスケジュールできますか?他のスレッドへの影響を最小限に抑えるために、非常に低いレベルのプロセス/スレッドを持つ物理コアがありますか?
優先順位の高いプロセスがスリープ状態にある場合は、以前の物理コアの2つの仮想コアを優先順位の低いプロセスで再利用できるため、他のすべてのプロセスのtaskset
CPUアフィニティマスクから1つの物理コアを除外できます。
編集:とアルダーレイクプロセッサパフォーマンスと効率的なコアのハイブリッドアーキテクチャにより、この質問は次のように拡張されます。
優先順位の低いプロセスを効率的なコアに強制する方法パフォーマンスコアをアイドル状態に保つ(省電力)または優先順位の高いプロセス用に予約(パフォーマンスを最大化するための熱予算を維持)ターボチャージャー)?
答え1
- 正確に望むもの(特にOPのコメントで議論されているもの)は、タスクの移行と同期して、一部のコアをオンライン/オフラインに切り替える必要があります。 =>スケジューラのみがこれを実行できます。
- スケジューラによってスケジュールされたジョブを実行するために使用できるコアセットは、スケジューラに対する制約です。 (つまり、スケジューラはCFS、BFS、およびULE AFAIKを制御できません。)
したがって、達成する方法はありません。正確にあなたは何が欲しいですか?
しかし、いくつかの独立したカーネル機能がこのようなことを引き起こす可能性がありますが、無料のランチはなく、コストは高い優先順位で実行されるアプリケーションによって異なります。
1つのアイデアは、これらのアプリケーションを起動するための専用スクリプトを作成することです。特別なスクリプトは次のとおりです。
1/不要な兄弟姉妹をオフラインにする
さて、これはあなたが知っていると仮定します物理ジョブを実行するコアをCPU2とします。しかし、それが何であるかを知る必要があります。 §2を読んでください。
これはゼロを書くことで達成できます。/sys/devices/system/cpu/cpu3/online
2/プロセスのCPUアフィニティ設定
これを作成する際の主な目的は、L1キャッシュをできるだけ保存することです。 L1 キャッシュにまったく関心がある場合は、公正な配布によるスケジューラの決定に応じて、いつでもタスクを別のコアに移行したくないでしょう。
これはいくつかの方法で達成できます。その理由は、私が好むセクション3で確認できます。スケジュールツールそして、-aオプションはCPU2が必要であることを認めます:
schedtool -a 0x4 -e yourapp_name yourapp_parms
3/プロセスのスケジューリングポリシーと優先順位の設定
SCHED_FIFO ジョブをスケジュールすると、多くの役に立ちます。タイムピースジョブは、優先順位の高いジョブが実行またはブロックされる場合にのみスケジュールされます。 -Fおよび-pオプションを使用して
これを達成する方法はいくつかあります。schedtool
schedtool -F -p 5 -e yourapp_name yourapp_parms
schedtool
相関設定と予約ポリシー設定を単一のコマンドにまとめることができるので、これをお勧めします。
schedtool -a 0x04 -F -p 5 -e yourapp_name yourapp_parms
慎重に扱いましょう:リアルタイムミッションの世界に入るようになるので、自分が何をしているのかを知ることができます。特に、ジョブがCPUにバインドされている場合は、SCHED_FIFOを実行しているシステムで他のジョブの相対的な優先順位に注意する必要があります。ミッションの不合理さ...
4/タスクが完了した後に最初にオフラインだった兄弟を再挿入します。
これは1を作成することで達成できます。/sys/devices/system/cpu/cpu3/online
限定
このアプローチによれば、特権タスクが終了したときにのみスケジューラが兄弟タスクを使用できることがわかります。
CPU集中型ジョブSCHED_FIFOを実行している場合(スケジュールがまったくまたはほとんど予約されていないため)、これは問題ではありませんが、特権ジョブが実際にIO集約的であれば有害に思えるかもしれません(全体的なパフォーマンスの観点から)。
この場合、特権ジョブは(正しく)スケジュールされ、他のジョブはCPUを占有しますが(親愛なるL1キャッシュを削除可能)、兄弟ジョブはオフラインのままです。全体の待ち時間の間。
したがって、常にそうであるように、一般的なワークロードでシステムをベンチマークするだけで、このアプローチが実際に重要な利点を持つかどうかがわかります。