並列コンピューティング用にLinuxスケジューラを調整するには?

並列コンピューティング用にLinuxスケジューラを調整するには?

いくつかの並列計算を実行するために特に使用されるLinuxシステムがあり、スケジューラや他のパラメータを選択/調整してパフォーマンスを最大化する方法を理解しようとしています(これはAWSを使用してデプロイされるため、まだいくつかのオプションがあります)。重要な場合は、Linuxディストリビューションを何を使用するかについて)。

計算のさまざまな部分の間にわずかな微妙な依存関係があるため、計算をJavaで実装しました(全体的に約5Kの「タスク」がありますが、あるタスクは実行中にさまざまなポイントから別のタスクから情報を取得する必要があります)。私はこれを行う2つの方法を検討したいと思います。

現在の実装

現在の実装では、スレッド数はコア数と等しく、各スレッドは情報を待たないジョブを選択し、欠落している情報によって停止するまで処理してジョブミッションを破棄します。そして別のミッションを受けてください。これは計算が完了するまで続きます。

ここでは、各CPUは常にシングルスレッドにバインドされると予想されます。スケジューラに時間分割を行わないように「言う」必要がありますか、それとも自然に発生しますか?どうやって確かに分かりますか?

別の可能な実装

コンピューティングタスクを選択して削除する代わりに、Javaとwait()パラダイムを使用して、各「タスク」が独自のスレッドを持つように変更できます。notify()この変更の妥当性について自由にご意見をお寄せください(96コアシステムには5Kタスク=スレッドがあり、スピードを上げることができれば小さいかもしれません)。しかし、もっと重要なことは、私がこれを実装したとしましょう。 wait()強制的に呼び出さない限り、スケジューラに最大の時間を使用するように指示するにはどうすればよいですかnotify()。 Javaの使用に役立つことができますかyield()

関連参考資料

この回答スケジュール計画と参照に関する有用な背景知識があります。これそしてこれ調整可能なパラメータがあります。後者は、特に、上記の「現在の実装」でプロセッサの数を拡張しようとしたときに発見されたキュー競合に言及している。

付録 これUnix(およびLinux?)には時間がかかりません。スレッドが中断される唯一の方法は、優先順位の高いスレッドによって「プリエンプション」または一部のブロック操作を開始することです。これは本当に本当ですか?

とても感謝しています!

答え1

Javaで1:1スレッドモデルが保証されているかどうかはわかりません。これは、Javaスレッドがオペレーティングシステムのスレッドを表す場合もあれば、表示しない場合もあることを意味します。複数のJavaスレッドがJavaランタイム環境によって管理され、オペレーティングシステムに少ないスレッド数で表示されることがあります。これは実際に実装によって異なります。 1:1の関係を確保するには、低レベルの言語(CまたはRust)を使用することをお勧めします。

時間分割が重要なので、リアルタイム優先順位も選択することをお勧めします。setpriority()これにより、いくつかの興味深いスケジュール戦略にアクセスできます。SCHED_FIFO時間分割を避けるには、この戦略を使用してください。これにより、優先順位の高いスレッドがキューに追加されない限り、スレッドが完了する前に中断されません。すべての5,000スレッドの優先順位が同じ場合、コンテキスト切り替えを最小限に抑える事実上の先入れ先出しソリューションです。バラよりsched(7)もっと学ぶ。

スレッドは完了または呼び出されるまで中断されません。read()読み取る準備ができたときにクロススレッド通信を表すミューテックスまたは他のファイルを表すFDから。この時点で、他のスレッドを実行する機会を取得しながら、スレッドがブロックされます。

それで、5,000スレッドを使用して単にキューに追加するというアイデアは良いアイデアだと思います。

1つのトラップはカーネルに関連しています-rt。これは、パフォーマンスを犠牲にしてスレッドのウェイクアップ時間の精度を向上させる先制スケジューリングを提供します(CPUキューを早期にクリア)。これらの低レベルの質問については、パフォーマンスを最大化しようとしているため、これはうまくいきません。

関連情報