$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

NUMAアーキテクチャとswap insanity

MySQLのswap insanity問題という言葉を聞いて、なんのことかさっぱり分からなかったので、調べてみました。CPUとかLinuxとかMySQLとかちゃんと理解しているわけではないので、間違っていることを書くかもしれません。

NUMAアーキテクチャ

マルチプロセッサ用リアルタイムOSの解説 » ハードウェアアーキテクチャから見たマルチプロセッサの分類あたりが分かりやすい。
UMAアーキテクチャがメモリを全てのCPUの共有資源とみなしてグローバルにアクセスするのに対して、NUMAアーキテクチャは以下のようにメモリを管理する。

  • ノードという単位でメモリを分割し、各CPUが割り当てられたメモリをローカルメモリとして管理するようになる
    • numactlとかlibnumaとかで構成は変えれる?
  • 他のCPUが管理しているメモリにはそのCPU経由でアクセス可能
  • defaultの挙動だと他CPUのメモリにアクセスできるが、操作は出来ない?

LinuxとNUMAアーキテクチャ

NUMAアーキテクチャはOS側で何も考えなくても利用できるようになっているが、効率的なメモリアクセスを実現するために、Linux側にも修正が加えられている。
例えばプロセスのメモリが確保されているCPUで優先的にそのプロセスを実行するなど。このあたりはよくわかってない。

MySQLとNUMAアーキテクチャ

The MySQL “swap insanity” problem and the effects of the NUMA architecture « Jeremy Coleにまとまっている。
MySQLのようなデータベースシステムの場合、バッファプールなどで大量にメモリを使う。この時「メモリに空きがあるのにスワップが起こる」という状態になる可能性がある。

下のような手順でその状況になりうる。

  1. それぞれのCPUが管理しているメモリの利用が偏る
  2. いずれかのCPUのメモリがいっぱいになる
  3. そのCPUでメモリをさらに利用すると、他CPUのメモリに空きがあるにもかかわらずスワップが起こる


http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/ より

対策としては、メモリの利用を均等(--interleave=all)にするとか、いろいろあるけどまだ勉強不足。

まとめ

難しいですね。