Linux のページ回収まわりのカーネルパラメータ

Linux(kernel 2.6.32-303 以降)のDBサーバでメモリ16GB、スワップ領域16GBの場合、ざっくりこんな感じが良いかなという妄想メモ。

vm.swapiness=1
vm.overcommit_memory=2
vm.overcommit_ratio=80
vm.min_free_kbytes=524288
vm.extra_free_kbytes=1048576(kernel 3.5以降)
  • vm.swappiness=1 でページアウトよりページキャッシュ解放を優先させる。kernel 2.6.32-303 以降、0 にすると OOM Killer が発動しやすくなるらしいので、1 にする。
  • vm.overcommit_memory=2 でオーバーコミットしないようにして、OOM Killer が発動しにくくする
  • vm.overcommit_ratio=80 で仮想メモリ割当をメモリサイズ + スワップ領域のサイズ * 80% にする。
  • vm.min_free_bytes をデフォルト(動的に導出される)より大きめに設定し、余裕を持ってページ回収する。
    • 512MB に設定すると、空きメモリが640MB(low pages)を下回ると kswapd がページ回収を開始し、768MB(high pages)を超えるとやめる。空きメモリが 512MB を下回るとプロセスがメモリ要求時に同期でページ回収が実行される(direct reclaim)。
  • kernel 3.5 以降なら、vm.extra_free_kbytes を設定して、low pages、high pages に 1GB 加算し direct reclaim が発生しにくくする。
  • メモリ使用率監視閾値(アラート)が 90% なら、low pages がメモリの 10%+α くらいにすると良さげな気がする。

Solaris テイストになりました。
80%、512MB、1GB は割と適当です。


ページ回収まわりでは zone_reclaim_mode も気になるところ。