11

ActivePivot アプリケーションを新しいサーバー (4 ソケットの Intel Xeon、512 GB のメモリ) に移行しています。展開後、アプリケーション ベンチマークを開始しました (これは、リアルタイム トランザクションに同時実行される大規模な OLAP クエリの組み合わせです)。測定されたパフォーマンスは、同様のプロセッサを搭載した以前のサーバーよりもほぼ 2 倍遅くなりましたが、コアは 2 倍少なく、メモリは 2 倍少なくなりました。

2 つのサーバーの違いを調査したところ、大きなサーバーにはNUMA アーキテクチャ(不均一なメモリ アクセス) があるようです。各 CPU ソケットは物理的にメモリの 1/4 に近いですが、残りの部分からは離れています...アプリケーションを実行する JVM は大きなグローバル ヒープを割り当てます。各 NUMA ノードには、そのヒープのランダムな部分があります。私たちの分析によると、メモリ アクセス パターンはかなりランダムであり、CPU コアは頻繁にリモート メモリへのアクセスに時間を浪費しています。

NUMA サーバーでの ActivePivot の活用に関するフィードバックをお待ちしています。ActivePivot キューブまたはスレッド プールを構成したり、クエリを変更したり、オペレーティング システムを構成したりできますか?

4

2 に答える 2

15

Peter は、NUMA アーキテクチャのパフォーマンスへの影響を軽減するために現在利用可能な一般的な JVM オプションについて説明しました。簡潔に言うと、NUMA 対応の JVM は NUMA ノードに関してヒープを分割し、スレッドが新しいオブジェクトを作成すると、そのスレッドを実行するコアの NUMA ノードにオブジェクトが割り当てられます (同じスレッドが後で使用する場合)。その場合、オブジェクトはローカル メモリにあります)。また、ヒープを圧縮する場合、NUMA 対応の JVM は、ノード間で大きなデータ チャンクを移動することを回避します (そして、stop-the-world イベントの長さを短縮します)。

したがって、すべての NUMA ハードウェアおよびすべての Java アプリケーションでは、おそらく-XX:+UseNUMAオプションを有効にする必要があります。

しかし、あまり役に立たない ActivePivot の場合: ActivePivot はメモリ内データベースです。リアルタイムの更新がありますが、アプリケーションの存続期間中、データの大部分がメイン メモリに存在します。JVM オプションに関係なく、データは NUMA ノード間で分割され、クエリを実行するスレッドはメモリにランダムにアクセスします。ActivePivot クエリ エンジンのほとんどのセクションが、メモリをフェッチできる限り高速に実行されることがわかっているため、NUMA の影響は特に顕著です。

では、NUMA ハードウェアで ActivePivot ソリューションを最大限に活用するにはどうすればよいでしょうか?

ActivePivot アプリケーションがリソースの一部しか使用しない場合は、簡単な解決策があります (複数の ActivePivot ソリューションが同じサーバーで実行されている場合によくあることです)。たとえば、64 コアのうち 16 コアのみを使用し、テラバイトのうち 256 GB のみを使用する ActivePivot ソリューションです。その場合、JVM プロセス自体を NUMA ノードに制限できます。

Linux では、JVM 起動の前に次のオプション ( http://linux.die.net/man/8/numactl ) を付けます。

numactl --cpunodebind=xxx

サーバー全体が 1 つの ActivePivot ソリューション専用である場合は、ActivePivot 分散アーキテクチャを利用してデータを分割できます。4 つの NUMA ノードがある場合、4 つの ActivePivot ノードをホストする 4 つの JVM を開始し、それぞれがその NUMA ノードにバインドされます。この展開により、クエリはノード間で分散され、各ノードは適切な NUMA ノード内で最大のパフォーマンスで作業のシェアを実行します。

于 2012-11-05T14:28:10.643 に答える
8

使用してみることができます-XX:+UseNUMA

http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html

これで期待どおりの結果が得られない場合はtaskset、JVM を特定のソケットにロックし、サーバーをそれぞれ 1 つの JVM を持つ 4 つのマシンに効果的に分割する必要があります。

より多くのソケットを備えたマシンは、メモリ (ローカル メモリでさえも) へのアクセスが遅くなり、結果として必要なパフォーマンスの向上が常に得られることを観察しました。

于 2012-10-31T14:46:27.470 に答える