2.3.2 Cgroup的接口和使用
Cgroup的原生接口通过cgroupfs提供,类似于procfs和sysfs,是一种虚拟文件系统。以下用一个实例演示如何使用Cgroup。
(1)挂载cgroupfs
命令如下:
# mount –t cgroup –o cpuset cpuset /sys/fs/cgroup/cpuset
首先必须将cgroupfs挂载起来,这个动作一般已经在启动时由Linux发行版做好了。可以把cgroupfs挂载在任意一个目录上,不过标准的挂载点是/sys/fs/cgroup。
注意 实际上sysfs里面只有/sys/fs/cgroup目录,并且sysfs是不允-许用户创建目录的,这里可以将tmpfs挂载上去,然后在tmpfs上创建目录。
(2)查看cgroupfs
# ls /sys/fs/cgroup/cpuset cgroup.clone_children cpuset.memory_pressure cgroup.procs cpuset.memory_pressure_enabled cgroup.sane_behavior cpuset.memory_spread_page cpuset.cpu_exclusive cpuset.memory_spread_slab cpuset.cpus cpuset.mems cpuset.effective_cpus cpuset.sched_load_balance cpuset.effective_mems cpuset.sched_relax_domain_level cpuset.mem_exclusive notify_on_release cpuset.mem_hardwall release_agent cpuset.memory_migrate tasks
可以看到这里有很多控制文件,其中以cpuset开头的控制文件都是cpuset子系统产生的,其他文件则由Cgroup产生。这里面的tasks文件记录了这个Cgroup的所有进程(包括线程),在系统启动后,默认没有对Cgroup做任何配置的情况下,cgroupfs只有一个根目录,并且系统所有的进程都在这个根目录中,即进程pid都在根目录的tasks文件中。
注意 实际上现在大多数Linux发行版都是采用的systemd,而systemd使用了Cgroup,所以在这些发行版上,当系统启动后看到的cgroupfs是有一些子目录的。
(3)创建Cgroup
# mkdir /sys/fs/cgroup/cpuset/child
通过mkdir创建一个新的目录,也就创建了一个新的Cgroup。
(4)配置Cgroup
# echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus # echo 0 > /sys/fs/cgroup/cpsuet/child/cpuset.mems
接下来配置这个Cgroup的资源配额,通过上面的命令,就可以限制这个Cgroup的进程只能在0号CPU上运行,并且只会从0号内存节点分配内存。
(5)使能Cgroup
# echo $$ > /sys/fs/cgroup/cpuset/child/tasks
最后,通过将进程id写入tasks文件,就可以把进程移动到这个Cgroup中。并且,这个进程产生的所有子进程也都会自动放在这个Cgroup里。这时,Cgroup才真正起作用了。
提示
$$表示当前进程。另外,也可以把pid写入cgroup.procs中,两者的区别是写入tasks只会把指定的进程加到child中,写入cgroup.procs则会把这个进程所属的整个线程组都加到child中。