問題タブ [numa]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
cpu-architecture - ローカル CPU は、パケット受信時にリモート CPU のパフォーマンスを低下させる可能性があります
私は 2 つの Intel Xeon CPU E5-2620 (Sandy Bridge) と 10Gbps 82599 NIC (2 ポート) を搭載したサーバーを持っており、これをハイパフォーマンス コンピューティングに使用しました。PCI アフィニティから、10G NIC が CPU1 に接続されていることがわかります。実験を行うためにいくつかのパケット受信スレッドを起動しました。スレッドはパケットを受信し、IP/UDP 解析を行い、バッファにコピーします。10G NIC に使用したドライバーは IOEngine PacketShader/Packet-IO-Engine · GitHub
Q1! アイドル状態の CPU1 は CPU0 のパケット受信性能を低下させます
1.1) CPU0 に 1 つまたは 2 つまたは 4 つのスレッドが結合されている場合、すべてのスレッドの全体的なパフォーマンスは約 2.6 ~ 3.2Gbps です 1.2) 2 つのスレッドが CPU1 に結合されている場合、全体的なパフォーマンスは 16.XGbps 1.3) 4 つのスレッドが結合されている場合CPU1 への全体的なパフォーマンスは 19.XGbps (2 * 10G ポートで最大)
CPU0 は NIC に直接接続されていないため、CPU0 での最大受信速度は 2.6 ~ 3.2Gbps のようです。ただし、計算集約型のプロセスが CPU1 で実行されると、CPU0 のパケット受信スレッドが 2 スレッドで 15.XGbps、4 スレッドで 19.XGbps にブーストされることがわかりました。
これは電源管理のせいですか?CPU1 がアイドル状態の場合、省電力モードで動作しますか? そうだとしても、CPU1 が CPU0 のパフォーマンスにどのように影響するのでしょうか? QPI について不明な点はありますか?
Q2!CPU1 の過負荷により、すべてのパケット受信パフォーマンスが低下する
2.1) 1 つのパケット受信スレッドが CPU0 で実行され、1 つのパケット受信スレッドが CPU1 で実行される場合、全体のパフォーマンスは 10Gbps です。各スレッドのパフォーマンスはほぼ同じで、5.X Gbps です。2.2) 2 つのパケット受信スレッドが CPU0 で実行され、2 つのパケット受信スレッドが CPU1 で実行される場合、全体のパフォーマンスは 13Gbps です。また、各スレッドのパフォーマンスはほぼ同じで、2.1、1.2、および 1.3 よりも低い 3.X Gbps です。
つまり、CPU0 と CPU1 の両方で実行されているスレッドを受信すると、すべてのスレッドが最大のパフォーマンスを達成できず、パフォーマンスはほぼ同じになります。
NUMA と QPI について知らないことがたくさんあると思いますが、これについて説明してくれる人はいますか? ありがとう
multithreading - 大規模なマルチコア マシンでのデータ集約型タスクのマルチスレッド パフォーマンスへの影響は?
大規模なマルチコア マシンでのマルチスレッド パフォーマンスの問題に関する投稿を読んでい ます: http://www.reddit.com/r/Python/comments/1mn12l/what_you_do_not_like_in_python/ccbc5h8マルチスレッド アプリケーションは、マルチプロセッシング アプリケーションよりもパフォーマンスに大きな影響を与えます。
AFIAK マルチスレッドは現在、マルチプロセッシングより安価です (システム管理とコンテキスト切り替えの両方の点で)。簡単にするために、ロックを使用する必要はないと仮定しましょう。
共有メモリを保護するためにロックを使用しない場合、マルチスレッド アプリケーションとそれらのリソースへのアクセスを管理するためのシステム制限はありますか?
マルチスレッドがパフォーマンスに大きな影響を与える場合(投稿者が持っていた)、ユーザー空間の実装に関連しない理由はありますか?
つまり、同様のマルチプロセス ソリューションと比較して、データ集約型のマルチスレッド アプリケーションのパフォーマンスを低下させるシステム レベルのプロパティは何ですか?
スレッドとプロセスのセマンティックの違いを認識しています。
java - マルチスレッドは NUMA のソケット スループットを低下させます
Red Had Linux を搭載した 16 コアの NUMA マシンで Java プログラムのベンチマークを行いました。Java DatagramSocket (UDP 用) のスループットを、1 秒間に送受信できる (64 バイト サイズの) パケット数で測定しました。このプログラムは、単一のソケットと、ソケットをリッスンする n 個のスレッドで構成されていました。パケットが到着すると、ペイロードを byte[] 配列にコピーし、その配列を使用して新しい DatagramPacket を作成し、元の場所にすぐに送り返します。UDP 層での ping と考えてください。
複数のスレッド (2 つまたは 4 つなど) を使用すると、Java DatagramSocket ソケットのスループットが大幅に低下することがわかりました。ソケットをリッスンするために 1 つのスレッドのみを使用すると、1 秒あたり 122,000 パケットのスループットが達成されますが、複数のスレッドでは 1 秒あたり 65,000 パケットしか達成されません。これで、NUMA マシンの任意のコアでスレッドが実行される可能性があり、メモリがあるノードから別のノードに移動する必要がある場合、メモリ アクセスが高価になることがわかりました。ただし、2 つのスレッドがある場合、「間違った」コアで実行されるのは 1 つだけで、もう 1 つのスレッドは依然として非常に高いスループットを達成するはずです。もう 1 つの考えられる原因は、Datagramsocket の同期の問題ですが、これらは推測にすぎません。本当の説明が何であるかについて、誰かが良い洞察を持っていますか?
このプログラムを複数のポートで複数回 (並行して) 実行すると、全体的なスループットが向上することがわかりました。1 つのスレッドでプログラムを 4 回開始し、各プログラムは別々のポート (5683、5684、5685、および 5686) でソケットを使用しました。4 つのプログラムの合計スループットは、1 秒あたり 370,000 パケットでした。要約すると、同じポートで複数のスレッドを使用するとスループットが低下し、1 つのスレッドで複数のポートを使用するとスループットが向上します。これはどのように説明できますか?
システム仕様:
ハードウェア: 2 つの AMD Opteron(TM) プロセッサ 6212 プロセッサ上の 16 コアは、それぞれ 32 GB RAM を備えた 4 つのノードで構成されています。周波数: 1.4 Ghz、2048 KB キャッシュ。
OS は Red Hat Enterprise Linux Workstation リリース 6.4 (Santiago) で、カーネル バージョンは2.6.32-358.14.1.el6.x86_64
. Java バージョン"1.7.0_09"
、Java(TM) SE ランタイム環境 ( build 1.7.0_09-b05
)、Java HotSpot(TM) 64-Bit Server VM ( build 23.5-b02, mixed mode
)、および-XX:+UseNUMA
フラグを使用しました。サーバーとクライアントは 10GB イーサネットで接続されています。
c++ - NUMA マルチプロセッサ マシンのタイミングを理解する
NUMA のトピックは初めてです。また、私はプログラマーであり、ハードウェアに関する深い知識はありません。
Quad Operton 6272 サーバーで作業しています。マザーボードはSuperMicro H8QGi+-Fで、合計 132GB のメモリ (8 個の16GB スティック) があります。
メモリ スティックは、マザーボード スロット 1A および 2A (Operton の「パッケージ」ごとに 2 つ) に取り付けられます。このドキュメントでは、Operton の「CPU」が階層的なものであると説明しています: パッケージ -> ダイ -> モジュール -> コア。このセットアップでは、'numactl --hardware' は 4 つの NUMA ノード、16 個の CPU、およびそれぞれ 32GB のメモリを報告します。メモリースティックをスロット 1A と 2A に挿入するのが最善かどうかはわかりませんが、これは ATM で実験していることです。
NUMA メモリ アクセスのプロパティを理解するのに役立つテスト C++ プログラムを作成しました。
このプログラムはバッファを割り当て、ランダムな整数で埋め、意味のない計算を行います。ループの反復では、バッファーを割り当てるスレッド/コア番号と、作業を行うコア/スレッド番号を変化させます。メモリ割り当ては、スレッド 0、8、16、...、56 で行われます。一度に計算を行うスレッドは16iから16(i+1)までの 16 スレッドのみです。
1 単位の作業と 20 単位の作業を行うのに必要な時間を計算しています。これは、一部のスレッドが実行を終了したときの速度の変化を確認するために行われます。
以前の実験から、スレッド8iから8i+7までのメモリ アクセス時間は同じであることに気付きました。したがって、8 つのサンプルの平均タイミングを出力しているだけです。
私のプログラムによって生成される出力の構造を説明しましょう。最も外側のレベルにはブロックがあり、それぞれがメモリ割り当て/初期化を行う 1 つのスレッドに対応しています。このような各ブロックには 4 行が含まれており、各行は計算を行う Operton の「パッケージ」の 1 つに対応しています (割り当てコアが現在の Operton の「パッケージ」に属している場合、作業は迅速に行われることが期待されます)。各行は 2 つの部分で構成されます。最初の部分はパッケージのコア 0 ~ 7 に対応し、2 番目の部分はコア 8 ~ 15 に対応します。
出力は次のとおりです。
たとえば、コア #16 による割り当てに対応するブロックの 4 行目は、「3.1222|45.1603 / 1.91962|37.9283」です。これは平均して、コア 48-55 3.1222 秒で最初の作業単位を実行し、45.1603 秒で 20 単位の作業をすべて実行したことを意味します (コア 56-63 が終了すると明らかにスピードアップするため、20 倍以上ではありません) )。線の後半は、コアが最初の反復を完了するのに平均 56 ~ 63 1.91962 秒かかり、20 回の反復すべてを実行するのに 37.9283 秒かかったことを示しています。
理解できないこと:
- たとえば、スレッド 8 で割り当てが完了すると、スレッド 0 ~ 7 はスレッド 8 ~ 15 よりも前にジョブを終了します。割り当てと初期化を行うスレッドは、少なくとも他のすべてのスレッドより遅くならないようにします。
- 4 つの Operton パッケージには非対称性があります。たとえば、package1 のメモリ (コア 0 または 8 によって割り当てられた場合) への平均的なアクセスは、package4 のメモリ (コア 48 または 56 によって割り当てられた場合) よりも高速です。
なぜこれが起こっているのか、誰かが洞察を与えることができますか?