Control the size of the ZFS ARC cache dynamically | @mzachh's Weblog
http://blog.zach.st/2014/08/02/control-the-size-of-the-zfs-arc-cache-dynamically.html
からメモ。あとで試す。
ZFS の ARC は未使用のメモリを使ってキャッシュをするが、
ARC が未使用のメモリを使い過ぎるとアプリケーションがメモリを要求した時に
ARC がメモリを開放するのを待たなくてはならない状況になり、
パフォーマンスが落ちる。
カーネルパラメータの zfs_arc_max で ARC が使うメモリの最大値を設定できていたが、
Oracle Solaris 11.2 で zfs_arc_max がなくなり user_reserve_hint_pct が用意された。
これを使って、ユーザが使うメモリを予約することで、
ARC が使うメモリの最大値を制御することが可能になるってことらしい。
My Oracle Support の
“Memory Management Between ZFS and Applications in Oracle Solaris 11.2 (Doc ID 1663862.1)”で
set_user_reserve.sh という名前のスクリプトが提供されていて、
これを使うと動的に ARC のサイズを変更することができるらしい。
Kernel zone を使うためには、このスクリプトで ARC のサイズを小さく
(メモリの予約を大きく)してもだめで、
結局、/etc/system か /etc/system.d 以下に適当なファイル(/etc/system.d/zfs_arc_max とか)を作って
以下のような内容を書く必要がある。
set zfs:zfs_arc_max = 8589934592
右辺の単位は bytes
(追記)
Kernel zone は連続したメモリ領域を必要とするらしく、
スクリプトで動的に user_reserve_hint_pct を変更しても、
連続したメモリ領域を確保できるとは限らないことが原因?