summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Hubbs <w.d.hubbs@gmail.com>2013-02-17 15:14:06 -0600
committerWilliam Hubbs <w.d.hubbs@gmail.com>2013-02-19 17:09:30 -0600
commitfac96b4df4b61db399bfa18549be162e9861b0b5 (patch)
treeb6469bbad6cfa12682c5fc3abe2265a644fae071
parentebf85d598e6ad2628e5d472ceeda3f86b2f0eac1 (diff)
downloadopenrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.gz
openrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.bz2
openrc-fac96b4df4b61db399bfa18549be162e9861b0b5.tar.xz
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.Linux40
-rw-r--r--sh/rc-cgroup.sh.in83
2 files changed, 90 insertions, 33 deletions
diff --git a/etc/rc.conf.Linux b/etc/rc.conf.Linux
index 7571f98..4fb48ae 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 c9a0062..449c1d3 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
}