CGroups on CentOS 6
Server - CentOS

Cgroups are hierarchically designed just like processes and the child processes that inherit the attributes of the parent process. Since init is ultimately the parent of all processes, because it is the first process to start, this is structured like a tree. For processes this tree structure means that there is just a single hierarchy or tree.

 

This is different with cgroups because they can have multiple hierarchies. So cgroups may have multiple trees which are not connected, though child cgroups still inherit certain attributes of the parent.

 

Cgroups can have multiple hierarchies because each hierarchy is attached to one or more subsystems (also known as resources controllers or controllers). This will then create multiple trees which are unconnected. There are nine subsystems available.

 

blkio sets limits on input/output access on block devices

cpu scheduler for cgroup task access to the CPU

cpuacct generate reports for CPU use and cgroup

cpuset assign CPUs and memory to a cgroup

devices manage access to devices by tasks

freezer suspend/resume tasks

memory limit memory

net_cls tag network packets to allow Linux traffic controller to identify task traffic

ns namespace

 

Installation

Installation requires the libcgroup which includes the utilities that are needed to work with cgroups. These utilities will make it easier to manage cgroups.

 

yum install -y libcgroup

 

Configuration

The /etc/cgconfig.conf file is used to start the cgroups so they are persistent on restarts. By default the cgroup configuration is turned off.

 

chkconfig –list

cgconfig 0:off 1:off 2:off 3:off 4:off 5:off 6:off

 

Make it persistent by changing it to on in the runlevel you are using.

 

chkconfig –level 3 cgconfig on

 

 

Here is the default cgconfig.conf which contains mount and group entries.

 

mount {

cpuset = /cgroup/cpuset;

cpu = /cgroup/cpu;

cpuacct = /cgroup/cpuacct;

memory = /cgroup/memory;

devices = /cgroup/devices;

freezer = /cgroup/freezer;

net_cls = /cgroup/net_cls;

blkio = /cgroup/blkio;

}

 

 

When you start cgconfig you will see new directories created in the /cgroup directory.

 

service cgconfig start

Starting cgconfig service: [ OK ]

 

ls /cgroup/

blkio cpu cpuacct cpuset devices freezer memory net_cls

 

Each one of these directories contains parameters that can be tuned.

 

ls cpu

cgroup.procs cpu.cfs_quota_us cpu.rt_runtime_us cpu.stat release_agent

cpu.cfs_period_us cpu.rt_period_us cpu.shares notify_on_release tasks

 

 

If you look in these directories they are populated with files that indicate the processes that are being managed. For example if you look at cgroup.procs you will see all of the processes by default.

 

cat /cgroup/cpu/cgroup.procs

1

2

3

4

---cut---

 

The susbsystems can be listed by using the lssubsys command:

 

lssubsys -am

ns

perf_event

cpuset /cgroup/cpuset

cpu /cgroup/cpu

cpuacct /cgroup/cpuacct

memory /cgroup/memory

devices /cgroup/devices

freezer /cgroup/freezer

net_cls /cgroup/net_cls

blkio /cgroup/blkio

 

 

The /etc/cgroup.conf file uses two types of entries; mount and group. The mount entries create hierarchies and subsystems within those hierarchies. Here is the syntax:

 

mount {

<controller> = <path>;

}

 

The group entries are used to create cgroups and set subsystem parameters.

 

group <name> {

perm {

task {

uid = root;

gid = root;

}

admin {

uid = root;

gid = root;

}

}

cpu {

cpu.shares = 100;

}

}