$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

NUMAアーキテクチャとswap insanity

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

NUMAアーキテクチャ

http://www.nces.is.nagoya-u.ac.jp/NEXCESS/blog/index.php?itemid=211あたりが分かりやすい。
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)にするとか、いろいろあるけどまだ勉強不足。

まとめ

難しいですね。