NUMAって、そもそもナニ?

はじめに

コンピュータの中には、大きく分けて 「CPU(処理装置)」「メモリ(記憶装置)」 があります。

CPUは「計算する人」、メモリは「作業台の上に広げたメモ帳」だとイメージしてください。

この構成では、CPUはメモリのどこにでも 同じ速さ でアクセスできます。シンプルで分かりやすいですね。これを専門用語で UMA(Uniform Memory Access=均一メモリアクセス) と呼びます。「どこも均一だよ」という意味です。

CPUが2個以上になると何が起きる?

最近のサーバーや高性能なPCでは、CPUが 2個、4個、それ以上 搭載されていることがあります。

「じゃあメモリも全部まとめて、みんなで仲良く使えばいいじゃん!」…と思いますよね。ところが、これが 意外とむずかしい のです。

問題:メモリを全員で共有すると「渋滞」が起きる

CPUが増えれば増えるほど、メモリへのアクセスが集中します。まるで、一本道の橋に車が殺到するような状態です。

CPUを増やしても、メモリへの「道」がボトルネックになって、期待通りに速くならない…というジレンマが生まれます。

そこで登場!NUMA(ヌーマ)

NUMA とは Non-Uniform Memory Access、日本語にすると 「不均一メモリアクセス」 の略です。

「不均一」というのがポイント。「わざとえこひいきする仕組み」と言い換えてもいいかもしれません。

NUMAの発想:「近くにメモリを置こう」

NUMAでは、それぞれのCPUに 「自分専用の近いメモリ」 を割り当てます。

このCPU+メモリのひとかたまりを 「NUMAノード」 と呼びます。

近いと遠い、これがNUMAの核心

NUMAでは、メモリへのアクセス速度が 「どこのメモリか」によって変わります

アクセス先距離速度
自分のノードのメモリ近い速い
別のノードのメモリ遠い遅い

具体的にどのくらい違う?

別ノードのメモリへのアクセスは、ローカルと比べて 1.5〜3倍程度遅くなる こともあります。

これを 「NUMAの距離(NUMA Distance)」 と呼び、数値で管理されています。

自分自身は「10」、隣のノードは「21」、遠いノードは「31」といった具合です。

なぜNUMAで性能が上がるの?

「均一じゃない方が不便じゃないの?」と思うかもしれません。

でも、こう考えてみてください。

大きなオフィスで、書類を取りに行くとき…

  • 自分のデスクの引き出し(近いメモリ) → すぐ取れる
  • 別のフロアの倉庫(遠いメモリ) → 時間がかかる

NUMAは「なるべく自分の引き出しを使う設計」にすることで、渋滞を避けつつ高速化を実現しているのです。

OSやアプリはNUMAをどう扱っている?

NUMAは「ハードウェアの仕組み」ですが、OS(オペレーティングシステム) がうまく活用してくれています。

  • LinuxはNUMAを認識し、プロセスをなるべく ローカルメモリで動かす よう制御します
  • numactl というコマンドで、「このプログラムはノード0で動かして!」と指定することもできます
  • データベース(PostgreSQL、MySQLなど)や仮想化基盤(VMwareなど)も、NUMA対応の最適化を行っています

まとめ:NUMAを一言で言うと

「複数のCPUそれぞれに専用メモリを持たせて、近くのメモリは速く・遠くのメモリは少し遅く扱う設計のこと」

用語意味
NUMANon-Uniform Memory Access(不均一メモリアクセス)
UMAUniform Memory Access(均一メモリアクセス)← NUMAの対義語
NUMAノードCPU+メモリのひとかたまりの単位
ローカルアクセス自分のノードのメモリへのアクセス(速い)
リモートアクセス別ノードのメモリへのアクセス(遅い)
NUMA Distanceノード間のアクセス遅延を示す指標

最後に

NUMAは最初は「なんだか複雑そう…」と感じるかもしれませんが、本質はシンプルです。

「自分の近くにあるものを使う方が速い」

これは、コンピュータの世界でも、私たちの日常でも、同じ原理なのです。サーバーの性能チューニングや、クラウド基盤の話を聞くときに「あ、NUMAの話だな」とピンとくれば、この読み物の目標は達成です!