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.
This commit is contained in:
William Hubbs
2013-02-17 15:14:06 -06:00
parent ebf85d598e
commit fac96b4df4
2 changed files with 90 additions and 33 deletions

View File

@@ -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
}