As you know, system resources like CPU,MEMORY,SWAP can be limited to Solaris local zones using capping.We do the resource capping by just using “zonecfg” command. But the changes are instantaneous ? No. You need to reboot the local zone in a order to take the settings effect.Here we will see how to make the changes instantaneous. But instantaneous
Here we are going to see how to modify the physical memory,SWAP,CPU & locked memory on the fly while zone is running. These changes are immediate effect.
Zones-Dynamic Memory using rcapadm:
To find the current capped physical memory use,
# zoneadm list -cv ID NAME STATUS PATH BRAND IP 0 global running / native shared 2 sol1 running /export/zone/sollz1 native shared # rcapstat -z 1 1 id zone nproc vm rss cap at avgat pg avgpg 2 sol1 31 146M 100M 100M 110M 0K 73M 0K bash-3.00#
We can see the capped memory value using zonecfg command as well,but there shouldn’t be any memory value modification on the system after the zone boot.
# zonecfg -z sol1 info zonename: sol1 zonepath: /export/zone/sollz1 brand: native autoboot: false bootargs: pool: limitpriv: scheduling-class: ip-type: shared hostid: inherit-pkg-dir: dir: /lib inherit-pkg-dir: dir: /platform inherit-pkg-dir: dir: /sbin inherit-pkg-dir: dir: /usr capped-cpu: [ncpus: 1.00] capped-memory: physical: 100M
As per the above command output ,capped memory has been set as 100M for local zone “sol1” . Now we will see how to modify that value on fly.
# rcapadm -z sol1 -m 200M # rcapstat -z 1 1 id zone nproc vm rss cap at avgat pg avgpg 2 sol1 31 146M 97M 100M 110M 0K 73M 0K # rcapstat -z 1 1 id zone nproc vm rss cap at avgat pg avgpg 2 sol1 31 146M 97M 200M 110M 0K 73M 0K
After executing rcapadm command ,system takes few seconds to take effect. So please be patient.Now you can see system memory capping has been changed from 100M to 200M.
Zones-Dynamic swap:
To check the currently capped swap space,
# /bin/prctl -n zone.max-swap `pgrep -z sol1 init` process: 1901: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.max-swap system 16.0EB max deny -
As per the above ,there is no restriction has been set for swap.
To set the swap to specific value,
# prctl -n zone.max-swap -r -v 150M `pgrep -z sol1 init` 1901: /sbin/init prctl: cannot modify system values
Oops.We got an error while setting new swap value for zone.
let us check the usage of prctl.
usage: Report resource control values and actions: prctl [-P] [-t [basic | privileged | system] [-n name] [-i process | task | project | zone] id ... -P space delimited output -t privilege level of rctl values to get -n name of resource control values to get -i idtype of operand list Manipulate resource control values: prctl [-t [basic | privileged | system] -n name [-srx] [-v value] [-p pid ] [-e | -d action] [-i process | task | project | zone] id ... -t privilege level of rctl value to set/replace/delete/modify -n name of resource control to set/replace/delete/modify -s set new resource control value -r replace first rctl value of matching privilege -x delete first rctl value of matching privilege, value, and recipient pid -v value of rctl to set/replace/delete/modify -p recipient pid of rctl to set/replace/delete/modify -e enable action of first rctl value of matching privilege, value, and recipient pid -d disable action of first rctl value of matching privilege, value, and recipient pid -i idtype of operand list
“-r” option is used to replace the existing value.We suppose to use “-s” option to set new value.
Let us try this as well.
# prctl -n zone.max-swap -s -v 150M `pgrep -z sol1 init` 1901: /sbin/init prctl: failed to create resource control zone.max-swap for pid 1901: Invalid argument bash-3.00#
After a lot of research, I got the workaround for this issue.prctl command will work only if you have already configured swap,locked memory and capped-cpu respectively for each type of resource. In my zone setup , i don;t have pre-configured swap.That’s why i was getting error while modifying it and unable to set new value as well.
So the bottom line is , if you have existing capped values for swap,locked memory & cpu ,you can modify it.Otherwise you can’t modify these values are in fly.
# zonecfg -z sol1 zonecfg:sol1> select capped-memory zonecfg:sol1:capped-memory> info capped-memory: physical: 100M zonecfg:sol1:capped-memory> set swap=100m zonecfg:sol1:capped-memory> set locked=10M zonecfg:sol1:capped-memory> info capped-memory: physical: 100M [swap: 100M] [locked: 10M] zonecfg:sol1:capped-memory> end zonecfg:sol1> verify zonecfg:sol1> commit zonecfg:sol1> exit # zoneadm -z sol1 reboot
Now you can try to set swap values,
# prctl -n zone.max-swap -r -v 150M `pgrep -z sol1 init` # /bin/prctl -n zone.max-swap `pgrep -z sol1 init` process: 7652: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.max-swap privileged 150MB - deny - system 16.0EB max deny
wow …its working fine.
Zones-Dynamic locked memory:
Let’s try to set new locked memory ,
# /bin/prctl -n zone.max-locked-memory `pgrep -z sol1 init` process: 7652: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.max-locked-memory privileged 10.0MB - deny - system 16.0EB max deny - # prctl -n zone.max-locked-memory -r -v 20M `pgrep -z sol1 init` # /bin/prctl -n zone.max-locked-memory `pgrep -z sol1 init` process: 7652: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.max-locked-memory privileged 20.0MB - deny - system 16.0EB max deny - bash-3.00#
Cool..Its working fine for locked memory as well.
Zones:Dynamic CPU:
We can modify the number of CPU’s using prctl command if capped-cpu is already configured on local zones.
# /bin/prctl -n zone.cpu-cap `pgrep -z sol1 init` process: 9383: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.cpu-cap privileged 100 - deny - system 4.29G inf deny
Existing value is showing as 100 . In zonecfg we have assigned “ncpus=1” . Which means zone sol1 can use 100% CPU time from one processor.
Let us set 200, so that zone sol1 can use 100% time of two CPU’s.
# prctl -n zone.cpu-cap -v 200 -r -i zone sol1 # /bin/prctl -n zone.cpu-cap `pgrep -z sol1 init` process: 9383: /sbin/init NAME PRIVILEGE VALUE FLAG ACTION RECIPIENT zone.cpu-cap privileged 200 - deny - system 4.29G inf deny - #
This has been done.Now zone “sol1” can use 2 CPU’s completely.
Note:Solaris 10 5/08: The zone.cpu-cap resource control sets an absolute limit on the amount of CPU resources that can be consumed by a zone. A value of 100 means 100 percent of one CPU as the project.cpu-cap setting. A value of 125 is 125 percent, because 100 percent corresponds to one full CPU on the system when using CPU caps.Refer:http://docs.oracle.com/cd/E19455-01/817-1592/z.config.ov-13/index.html
HonorGoG says
Beautiful! This article helped me solve a serious production problem that was affecting patient care. Thank you!
Rafa says
Hi friend what is the difference between physical and locked in rcapadm ?