HOME / コンピュータTips / Solaris / zones / Zonesのcpu-cap、memory-cap、swapなどを稼働中に変更する
Date: 2014/07/10 | | Tags: Solaris, Zones, cpu-cap, memory-cap, swap, 変更, apply
Solaris 11.2より、zoneadm applyというコマンドがあり、このコマンドを使うことで、稼働中のzoneのzonecfgの設定を反映することができます。
しかし11.1未満(Solaris 10含む)にはapplyはありません。それでも動いてるZoneのリソース設定は可能なのですが、この方法は意外と知られていないようなのでメモしておくことにしました。
確かに動的変更はできるのですが、これらを使った場合にZONEを再起動すると、当然zonecfgの設定に戻るのでzonecfg側も設定する必要があります。
rcapdによって管理されているので、rcapdにコマンドを送ります。
現在使ってる様子は
rcapstat -z 1
で見続けることができます。
サイズを4Gに変更する
sudo rcapadm -z p2vi160.justplayer.ne.jp -m 4096m
制限を外す
sudo rcapadm -z ZONE名 -m 0m
設定変更後の確認は、rcapstat -zで見ていればわかりますが、設定反映には1分ぐらいかかるので気長に見ていてください。
備考:rcapdにはポーリングでZoneがメモリを使いすぎているかどうかチェックしており、完全に溢れるとOut Of Memoryを出したりします。溢れたときの挙動はリソースの設定で異なります。
溢れる直前には、ページスキャナが走っているような気がします(prstatをみて私の推察しているだけで、確定ではありません)。この処理が動き始めると、rcapdがprstatの負荷ランキングにしばしば出場するようになってきます。そうなると全体的にvmstatで見たときに、(mf)minor faultとre(page reclaims)が増え、TLBの置き換えが走り始めて、CPU負荷が跳ね上がります。
このときは全体最適のためにcapをふやすべき。と、言うことになります。仮想メモリマネージャは奥が深いです。
cpu-capはリソースマネージャー(Project管理)で変更します。
今までcpu-cap設定されていないところに、cpu-cap=80%を設定する
prctl -t privileged -n zone.cpu-cap -v 80 -i zone ゾーン名
cpu-cap設定済みのものを、cpu-cap=50%に変更する
prctl -r -t privileged -n zone.cpu-cap -v 50 -i zone ゾーン名
cpu-cap設定済みのものを、解除する
prctl -x -t privileged -n zone.cpu-cap -i zone ゾーン名
CPUの設定が解除されたかは、
sudo prctl -n zone.cpu-cap `pgrep -z ゾーン名 init`
で、わかります。これが一番エレガントな方法かどうかはわかりませんが。
swapのcapとcpuのcapは基本的に同じ方法を使います。
今までmax-swapが設定されていないところに、max-swap=12GBを設定する。
sudo prctl -t privileged -n zone.max-swap -v 12G -i zone ゾーン名
max-swap設定済みのものを、max-swap=5GBに変更する。
sudo prctl -r -t privileged -n zone.max-swap -v 6G -i zone ゾーン名
max-swap設定済みのものを、解除する。
sudo prctl -x -t privileged -n zone.max-swap -i zone ゾーン名
max-swapの設定が解除されたかは、
sudo prctl -n zone.max-swap `pgrep -z ゾーン名 init`
で、わかります。これも同様、一番エレガントな方法かどうかはわかりませんが……。
swapの制限をすると実際に使っているswapの値(実際にはメモリを確保している量)が、df -hで見たときのtmpfsの利用量のように見えます。tmpfsとswapが共通だからでしょう。