diff options
author | William Hubbs <w.d.hubbs@gmail.com> | 2013-02-17 15:14:06 -0600 |
---|---|---|
committer | William Hubbs <w.d.hubbs@gmail.com> | 2013-02-19 17:09:30 -0600 |
commit | fac96b4df4b61db399bfa18549be162e9861b0b5 (patch) | |
tree | b6469bbad6cfa12682c5fc3abe2265a644fae071 | |
parent | ebf85d598e6ad2628e5d472ceeda3f86b2f0eac1 (diff) |
cgroups: major update to cgroups support
This reworks cgroups support so we have one variable in rc.conf for each
controller instead of each setting.
Also we add support for all of the possible cgroup controllers.
I would like to thank Alexander Vershilov for his help with testing and
reworking this code.
-rw-r--r-- | etc/rc.conf.Linux | 40 | ||||
-rw-r--r-- | sh/rc-cgroup.sh.in | 83 |
2 files changed, 90 insertions, 33 deletions
diff --git a/etc/rc.conf.Linux b/etc/rc.conf.Linux index 7571f984..4fb48ae9 100644 --- a/etc/rc.conf.Linux +++ b/etc/rc.conf.Linux @@ -29,12 +29,40 @@ rc_tty_number=12 # None of the other options in this section work if this is set to "NO". #rc_controller_cgroups="YES" -# These options can be set globally in this file; however, if you do -# this, the same setting will apply to all of your services. +# The following settings allow you to set up values for the cgroup +# controllers for your services. +# They can be set in this file;, however, if you do this, the settings +# will apply to all of your services. # If you want different settings for each service, place the settings in # /etc/conf.d/foo for service foo. +# The format is to specify the names of the settings followed by their +# values. Each variable can hold multiple settings. +# For example, you would use this to set the cpu.shares setting in the +# cpu controller to 512 for your service. +# rc_cgroup_cpu=" +# cpu.shares 512 +# " +# +#For more information about the adjustments that can be made with +#cgroups, see Documentation/cgroups/* in the linux kernel source tree. + +# Set the blkio controller settings for this service. +#rc_cgroup_blkio="" + +# Set the cpu controller settings for this service. +#rc_cgroup_cpu="" + +# Add this service to the cpuacct controller (any value means yes). +#rc_cgroup_cpuacct="" + +# Set the cpuset controller settings for this service. +#rc_cgroup_cpuset="" + +# Set the devices controller settings for this service. +#rc_cgroup_devices="" + +# Set the memory controller settings for this service. +#rc_cgroup_memory="" -# This is the number of CPU shares a service is allowed to use. The -# default value, set by the kernel, is 1024. -# This requires CONFIG_FAIR_GROUP_SCHED to be set in the kernel. -#rc_cgroup_cpu_shares=1024 +# Set the net_prio controller settings for this service. +#rc_cgroup_net_prio="" diff --git a/sh/rc-cgroup.sh.in b/sh/rc-cgroup.sh.in index c9a00622..449c1d37 100644 --- a/sh/rc-cgroup.sh.in +++ b/sh/rc-cgroup.sh.in @@ -15,45 +15,74 @@ cgroup_find_path() echo $result } -# prepare values to be attached inside cgroups -cgroup_prepare() +cgroup_set_values() { - local h=$(cgroup_find_path "$1") + [ -n "$1" -a -n "$2" -a -d "/sys/fs/cgroup/$1" ] || return 0 + + local controller="$1" h=$(cgroup_find_path "$1") cgroup="/sys/fs/cgroup/${1}${h}openrc_${RC_SVCNAME}" - [ -d ${cgroup} ] || mkdir -p ${cgroup} - return 0 -} + [ -d "$cgroup" ] || mkdir -p "$cgroup" -cgroup_set_value() -{ - [ -f "$cgroup/${1}" -a -n "$2" ] && echo $2 > "${cgroup}/${1}" - return 0 -} + set -- $2 + local name val + while [ -n "$1" -a "$controller" != "cpuacct" ]; do + case "$1" in + $controller.*) + if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then + veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" + echo $val > "$cgroup/$name" + fi + name=$1 + val= + ;; + *) + val="$val $1" + ;; + esac + shift + done + if [ -n "$name" -a -f "$cgroup/$name" -a -n "$val" ]; then + veinfo "$RC_SVCNAME: Setting $cgroup/$name to $val" + echo $val > "$cgroup/$name" + fi + + if [ -f "$cgroup/tasks" ]; then + veinfo "$RC_SVCNAME: adding to $cgroup/tasks" + echo 0 > "$cgroup/tasks" + fi -cgroup_add_process() -{ - [ -f "${cgroup}"/tasks ] && echo 0 > "${cgroup}"/tasks return 0 } cgroup_set_limits() { openrc_cgroup=/sys/fs/cgroup/openrc - if [ -d ${openrc_cgroup} ]; then - cgroup=${openrc_cgroup}/${RC_SVCNAME} - mkdir -p ${cgroup} - [ -f "${cgroup}"/tasks ] && echo 0 > "${cgroup}"/tasks + if [ -d "$openrc_cgroup" ]; then + cgroup="$openrc_cgroup/$RC_SVCNAME" + mkdir -p "$cgroup" + [ -f "$cgroup/tasks" ] && echo 0 > "$cgroup/tasks" fi - if [ -d /sys/fs/cgroup/cpu ]; then - local share + local blkio="${rc_cgroup_blkio:-$RC_CGROUP_BLKIO}" + [ -n "$blkio" ] && cgroup_set_values blkio "$blkio" + + local cpu="${rc_cgroup_cpu:-$RC_CGROUP_CPU}" + [ -n "$cpu" ] && cgroup_set_values cpu "$cpu" + + local cpuacct="${rc_cgroup_cpuacct:-$RC_CGROUP_CPUACCT}" + [ -n "$cpuacct" ] && cgroup_set_values cpuacct "$cpuacct" + + local cpuset="${rc_cgroup_cpuset:-$RC_CGROUP_cpuset}" + [ -n "$cpuset" ] && cgroup_set_values cpuset "$cpuset" + + local devices="${rc_cgroup_devices:-$RC_CGROUP_DEVICES}" + [ -n "$devices" ] && cgroup_set_values devices "$devices" + + local memory="${rc_cgroup_memory:-$RC_CGROUP_MEMORY}" + [ -n "$memory" ] && cgroup_set_values memory "$memory" + + local net_prio="${rc_cgroup_net_prio:-$RC_CGROUP_NET_PRIO}" + [ -n "$net_prio" ] && cgroup_set_values net_prio "$net_prio" - share=${rc_cgroup_cpu_shares:-$RC_CGROUP_CPU_SHARES} - if [ -n "$share" ]; then - cgroup_prepare "cpu" - cgroup_set_value "cpu.shares" $share - cgroup_add_process - fi - fi return 0 } |