370ソケットが2つ

どこで手に入れたのか、サーバーで使っていた
というM/B・ACORP6A815EPD・・・
CPUがペンティアムⅢの1GHzx2。。
そうなんです。このM/Bは370のソケットが2つ付いて
いるんです。
メモリは3スロットにPC-133の256MBx1、128MBx2で
可能最大搭載容量の512MBとなっています。
で、せっかく手に入れたのだからサーバー仕立てに
組んでみたいとのこと。

拙生:やめたら? @即答

確かに2CPUならCore2Duoみたいなものと思いがちですが、
そうは問屋が卸しません。
Core2Duoで1.6GHzx2でも知れているのに、なにせ
ペン31GHzx2ですから。。。

まずCPU1個のCacheが256KB。
で、メモリが合計で512MB。
この条件で考えてみます。

CPUのソケットが1個のものの大凡はSMPアーキテクチャ
と言い、マルチコアであってもCPUとメモリに
挟まっているキャッシュなどの構成はいずれも一緒です。

それに対しソケットが2つある場合などはNUMAになります。
このNUMAが(拙生には)厄介なんです。
CPUの一つと分割したメモリの領域のうちの一つとの間に
挟まるキャッシュなどのグループ構成をノードと呼びます。
分割した他方のメモリ領域はもうひとつのノードが使います。
NUMAはノード別SMPを夫々のキャッシュを使って横の
連絡をとっているって感じかな。

ノード0・ノード1として考えてみましょ。
ノード0のCPUがメモリを必要とする時、まずは同じノードに
分割されている領域から獲得しようとします。
ここでノード0のメモリに空き容量がなかったら、次に
ノード1の領域に使わせろとリクエストします。
そのやり取りはお互いのノードのキャッシュ渡しとなり
経路が長くなる分パフォーマンスが下がります。

それでもキャッシュやメモリが十分な容量と速度を
持っていればまだしも、如何せんキャッシはニゴロ、
512のメモリを分割すると、一つのノードにいくらも
割り当てることができません。
さらにこのころのキャシュやメモリは遅い。。。
もちろんノードだけがメモリを使うわけではないので
128MB程度しか割り当てることはできないはずです。

仮に各ノードに128MBずつメモリを搭載されたとします。
ノード0がメモリを200MB使う場合、足りない72MB分は
ノード1のものを使います。
その72MBはノード間のキャッシュ渡しなので経路が
長くなりパフォーマンスが低下します。
しかもノード0のメモリは使い切った状況なので、
メモリー回収が始まってしまいます。
つまりノード0がアプリで使っているメモリの一部は
スワップアウトされることになり、パフォーマンスが
極端に低下してしまいます。
最悪なのはスワップアウトした領域にアクセスがあると
そのためのメモリが必要になり、その分を使うために
更に他の一部がスワップアウト。。。
パフォーマンス低下の蟻地獄が始まってしまいます。

ま、その解決策はないこともないのですが、ひとつは
アプリ作成時のプログラム処理によりノード0で
アプリを動かしても、アクセスの少ないデータは
予めノード1の領域を使うというものです。
もうひとつはノード0と1を強制的に交互に使う
というインタリーブという手法です。
これはコマンドやシステムコールで実現しますが
両者ともある程度のメモリースペックがなければ
苦労する割に成果は得られません。

であるなら。。。
Core2Duo2GHz以上、メモリは2GBとか4GBにするほうが
ずっとマシってことなので、やめたら?と即答しちゃう
ことになります。

物理的に複数のCPUを載せるM/Bはお試ししたことは
あるものの、実用としたことはありません。
ですから解決策に必要なcpusetやnumadによる
チュニングの説明は拙生にはちょっと難易度が
高すぎです。。。。

これ以上訊かれないために、Core2DuoとLGA775のM/B、
DDR2-800MHz4GBをプレゼントすることにします。w
CPUのクロックもキャッシュも大事ですが、まずは
メモリを潤沢に積んでおかないとね。

HOME

おすすめ