2016年3月23日水曜日

Amazon Linux AMI 2016.03 のリリースノートをみてちょっといいなっておもった

Amazon Linux AMI 2016.03 が、3月22日付けでリリースされました。

Amazon Linux AMI 2016.03 Release Notes
Amazon Linux AMI 2016.03 Packages

リリースノートを見ていて以下の記載におっとおもった。

"NUMA balancing disabled by default"

普通の人はほとんど気にしないと思うんだけれど、微妙にマニアックなチューニング感がとても気になった。

NUMA

NUMA は プロセッサ とメモリの接続方式のこと。従来の方式ではプロセッサとメモリは一つのメモリコントローラ経由で接続されていた。ところが搭載されているプロセッサの数が多くなると、一つのメモリコントローラへ複数のプロセッサからのアクセスが集中し、ボトルネックになってくる。しょうがないので、プロセッサ単位でメモリを接続してしまえばいいのでは?と考えたひとがいる。
これで無事解決かっていうとそうでもなくて、プロセッサに直接つながっているメモリのアクセスは早くなるけれど、ほかのプロセッサに接続されているメモリへのアクセスが遅くなるという問題が発生する。それでも各プロセスがアクセスするデータは多くの場合、局所性が働くので全体としては大体早くなるはず!ということになっている。

NUMA balancing

当然そういった機構に関して、OS のサポートが必要になる。たとえば、同じプロセッサにアクセスするようにプロセスをスケジューリングするとか、メモリの割り当てをNUMA を考慮して、どこに割り当てるかとか、時々メモリの割り当て状況を見直すとか、結構いろいろなことが発生する。

こうした処理が追加されるので、OSの処理に若干のオーバーヘッドが発生する。なので sysctl を通じて、オフオンができるようになっている。

オフにする場合
# echo 0 > /proc/sys/kernel/numa_balancing

オンにする場合
# echo 1 > /proc/sys/kernel/numa_balancing

仮想化されている場合、CPU が PIN されてなければ実際はハイパーバイザでゲストに割り当てるCPUをスケジュールを決めるので、あまりゲスト側でNUMAを意識してもしょうがないのかな?という気もする。
それにオーバーヘッドがあるといっても通常はわずかなので、ほとんどの場合気にならないレベルなのだろうけど、AWS ぐらいあほみたいにコンピューティングユニット抱えていると電気代とか、ちりつもで結構馬鹿にならないのかもしれないとも思う。

とはいえ、比較的おおきなインスタンスでは、NUMA balancing を ON にしたほうが、効率的な場合もあって、実際に以下のインスタンスでは、有効にしたほうがいいようだ。


  • cr1.8xlarge
  • c3.8xlarge
  • r3.8xlarge
  • i2.8xlarge
  • c4.8xlarge
  • d2.8xlarge
  • g2.8xlarge
  • m4.10xlarge

有効にするには以下のコマンドラインを実行するように記載がある。

$ sudo sysctl -w 'kernel.numa_balancing=1'
$ echo 'kernel.numa_balancing = 1' | sudo tee /etc/sysctl.d/50-numa-balancing.conf


参考
「仮想化のチューニングと最適化ガイド」
  8.3. NUMA の自動負荷分散
https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/Virtualization_Tuning_and_Optimization_Guide/sect-Virtualization_Tuning_Optimization_Guide-NUMA-Auto_NUMA_Balancing.html

wikipedia の NUMA に関する項目
https://ja.wikipedia.org/wiki/NUMA