Slide 1

Slide 1 text

隣の芝は茶色いか 梅澤威志 twitter: @umezawa_takeshi

Slide 2

Slide 2 text

NUMA って 知ってますか

Slide 3

Slide 3 text

Non- Uniform Memory Access

Slide 4

Slide 4 text

不 均一な メモリ アクセス

Slide 5

Slide 5 text

NUMA とは • マルチプロセッサシステムにおいて、メモリ (要するにDRAM)へのアクセス(スループット、 レイテンシ)が均一でないような環境

Slide 6

Slide 6 text

もうちょっとわかりやすく • プロセッサから見て「近いメモリ」と「遠いメモ リ」があり、どのメモリが近いかはプロセッサ によって異なる環境のこと – どのメモリが近いかがプロセッサによらず同じで あるような環境は、単にメモリ階層が存在してい るだけ

Slide 7

Slide 7 text

つまりこういうこと プロセッサ メモリ メモリ プロセッサ 近い 近い 遠い

Slide 8

Slide 8 text

具体的な製品 • 最近だと PC でもマルチプロセッサシステムは 全部 NUMA である – Intel だと Nehalem の Xeon (2009) 以降 – AMD だと Opteron (2003) 以降

Slide 9

Slide 9 text

最近のPCのNUMAの図 CPU メ モ リ CPU メ モ リ I/O

Slide 10

Slide 10 text

ここから 本題

Slide 11

Slide 11 text

昔こんなこと言ってました • https://twitter.com/umezawa_takeshi/status/724997040715898881 • でも実は測ってない(=伝聞)

Slide 12

Slide 12 text

どうやって測ろう • ストアのレイテンシを測るのは難しい – いつ完了したのか知る方法がない • ロードのレイテンシを測ろう • ロードして、それが終わったらまたロードして …をたくさん(10秒ぐらい)繰り返す • 経過時間 ÷ ロード回数 = レイテンシ

Slide 13

Slide 13 text

それほど単純ではない(1) • 最近のプロセッサはスーパースカラ&アウト オブオーダーなので、単にロード命令を並べ ただけでは並列に実行されてしまう 並列に実行されないように、ロードしたらアド レスが取れて、そのアドレスからロードしてア ドレスが取れて…という構造にする(ロード間 に依存関係を発生させることで直列に実行さ せる)

Slide 14

Slide 14 text

それほど単純ではない(2) • 最近のプロセッサはハードウェアプリフェッチ があるので、規則正しいメモリアクセスを行う と勝手にアクセスしてキャッシュメモリまで 持ってきてしまう アクセスするアドレスがランダムになるように して、ハードウェアプリフェッチが効かないよう にする

Slide 15

Slide 15 text

それほど単純ではない(3) • 隣のキャッシュのデータをロードしたら自分の キャッシュにコピーができてしまう(たぶん) 諦めて隣のメモリのレイテンシを測って、自分 のメモリのレイテンシとの差で推測する

Slide 16

Slide 16 text

測定ツール • https://github.com/umezawatakeshi/numa_m emory_latency • 後述の機材が CentOS 6 で動いている関係上、 GCC 4.4.7 の C++0x の範囲で記述。(C++11 で も OK)

Slide 17

Slide 17 text

測定機材 • Dual Xeon E5-2630L v2 – Ivy Bridge EP – 6C12T – Base 2.4GHz, TB 2.8GHz – L1D$: 32KiB/core – L2$: 256KiB/core – L3$: 15MiB/socket • たまたま手の届く範囲にこれがあっただけ

Slide 18

Slide 18 text

測定上の注意 • このハードの管理者ではないので、 – サーバとしての製品名は知らない – EIST や TB や HT などをオフにすることもできない • このホストを占有できてはいないので、 – 他のプログラム(特にデーモン)が全く走っていな い状態で計測できているわけではない • 非常にザックリした測定であることに注意

Slide 19

Slide 19 text

測定結果 対象 レイテンシ L1キャッシュ (32KiB/core) ~1.6ns L2キャッシュ (256KiB/core) ~7.0ns L3キャッシュ (LLC) (15MB/socket) ~18ns ローカルノードの メインメモリ ~90ns リモートノードの メインメモリ ~190ns

Slide 20

Slide 20 text

結論 • 隣のメモリは遠い • というか隣のプロセッサが遠い • NUMAシステムで、複数のプロセッサにまた がってメモリをたくさん使うタスクを適切に書く のは難しいです

Slide 21

Slide 21 text

オマケ:よく分からないこと • L1 のレイテンシは CPU0 より CPU1 の方が小 さかった • L2 のレイテンシは計測誤差程度だった • L3 のレイテンシも CPU0 より CPU1 の方が小 さかった • 何回測っても同じ傾向になる • 計測手法に若干の問題がある可能性…?