32 コアの Opteron マシンを購入したばかりですが、得られるスピードアップには少しがっかりしています。約 24 スレッドを超えると、スピードアップがまったく見られず (実際には全体的に遅くなります)、約 6 スレッドを過ぎると、大幅にサブリニアになります。
私たちのアプリケーションは非常にスレッド フレンドリーです。私たちのジョブは約 170,000 の小さなタスクに分割され、それぞれが 5 ~ 10 秒で個別に実行できます。それらはすべて、サイズが約 4Gb の同じメモリ マップト ファイルから読み取ります。ときどき書き込みを行いますが、書き込みごとに 10,000 回の読み取りが必要になる場合があります。170,000 個のタスクのそれぞれの最後に、ほんの少しのデータを書き込むだけです。書き込みはロック保護されています。プロファイリングは、ロックが問題ではないことを示しています。スレッドは、非共有オブジェクトごとに大量の JVM メモリを使用し、共有 JVM オブジェクトへのアクセスはほとんど行わず、書き込みを伴うアクセスはごくわずかです。
NUMA を有効にして、Linux 上の Java でプログラミングしています。128GbのRAMがあります。それぞれ 16 コアの 2 つの Opteron CPU (モデル 6274) があります。各 CPU には 2 つの NUMA ノードがあります。Intel クアッドコア (つまり 8 コア) で実行されている同じジョブは、最大 8 スレッドまでほぼ直線的にスケーリングされました。
ほとんどのルックアップが NUMA ノードに対してローカルになることを期待して、スレッドごとに 1 つになるように読み取り専用データを複製しようとしましたが、これによるスピードアップは見られませんでした。
32 スレッドの場合、「top」は、CPU の 74% が「us」(ユーザー) で、約 23% が「id」(アイドル) であることを示しています。しかし、スリープはなく、ディスク I/O はほとんどありません。24 スレッドの場合、CPU 使用率は 83% になります。「アイドル」状態を解釈する方法がわかりません。これは「メモリ コントローラーを待機中」という意味ですか?
NUMA のオンとオフを切り替えてみましたが (リブートが必要な Linux レベルの設定について言及しています)、違いは見られませんでした。NUMA が有効になっている場合、「numastat」は「割り当てとアクセスのミス」の約 5% のみを示しました (キャッシュ ミスの 95% は NUMA ノードに対してローカルでした)。[編集:] しかし、"-XX:+useNUMA" を Java コマンドライン フラグとして追加すると、10% のブーストが得られました。
私たちが持っている 1 つの理論は、アプリケーションが大量の RAM を使用し、多くのキャッシュ ミスがあると考えているため、メモリ コントローラーを使い果たしているというものです。
(a) プログラムを高速化して線形スケーラビリティに近づけるか、(b) 何が起こっているかを診断するにはどうすればよいでしょうか?
また: (c) 「トップ」の結果をどのように解釈すればよいですか? 「アイドル」は「メモリ コントローラーでブロックされている」という意味ですか? (d) Opteron と Xeon の特性に違いはありますか?