Cgroup,全称Control Group(控制组),用于限制和隔离一组进程对系统资源的调用,即做资源QoS(Quality of Service,服务质量)。
Cgroup的原生接口通过cgroupfs提供,类似于procfs和sysfs,是一种虚拟文件系统。
挂载cgroupfs
此过程一般在启动时由linux发行版做好了。标准挂载点是/sys/fs/cgroup,可以变更。1
2
3
4
5
6
7
8
9
10
11
12
13mount -t cgroup -o cpuset /sys/fs/cgroup/cpuset/
# mount: cgroup 已经挂载或 /sys/fs/cgroup/cpuset 忙
# cgroup 已经挂载到 /sys/fs/cgroup/systemd 上
# cgroup 已经挂载到 /sys/fs/cgroup/blkio 上
# cgroup 已经挂载到 /sys/fs/cgroup/freezer 上
# cgroup 已经挂载到 /sys/fs/cgroup/devices 上
# cgroup 已经挂载到 /sys/fs/cgroup/perf_event 上
# cgroup 已经挂载到 /sys/fs/cgroup/net_cls,net_prio 上
# cgroup 已经挂载到 /sys/fs/cgroup/cpuset 上
# cgroup 已经挂载到 /sys/fs/cgroup/cpu,cpuacct 上
# cgroup 已经挂载到 /sys/fs/cgroup/hugetlb 上
# cgroup 已经挂载到 /sys/fs/cgroup/pids 上
# cgroup 已经挂载到 /sys/fs/cgroup/memory 上查看cgroupfs
cpuset开头的子文件都是由cpuset子系统产生的,其他文件则由Cgroup产生。这里的tasks文件记录了这个Cgroup的所有进程,包括线程。1
2
3
4
5
6
7
8
9
10
11
12ls /sys/fs/cgroup/cpuset/
# cgroup.clone_children cpuset.memory_pressure
# cgroup.event_control cpuset.memory_pressure_enabled
# cgroup.procs cpuset.memory_spread_page
# cgroup.sane_behavior cpuset.memory_spread_slab
# cpuset.cpu_exclusive cpuset.mems
# cpuset.cpus cpuset.sched_load_balance
# cpuset.effective_cpus cpuset.sched_relax_domain_level
# cpuset.effective_mems notify_on_release
# cpuset.mem_exclusive release_agent
# cpuset.mem_hardwall tasks
# cpuset.memory_migrate创建Cgroup
通过mkdir创建一个新的目录,也就是常见了一个新的Cgroup1
mkdir /sys/fs/cgroup/cpuset/child
配置Cgroup
配置这个Cgroup的资源配额,通过以下命令,可以先哲这个Cgroup的进程只能在0号cpu上运行,并且只能在0号内存节点分配内存。
1
2echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.mems使能Cgroup
通过将进程id写进tasks文件,将整个进程移动到Cgroup中,Cgroup真正起作用了
1
echo $$ > /sys/fs/cgroup/cpuset/child/tasks # $$表示当前进程id