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
0 件のコメント:
コメントを投稿