Cgroup简介

  Cgroup,全称Control Group(控制组),用于限制和隔离一组进程对系统资源的调用,即做资源QoS(Quality of Service,服务质量)。
  Cgroup的原生接口通过cgroupfs提供,类似于procfs和sysfs,是一种虚拟文件系统。

  1. 挂载cgroupfs
      此过程一般在启动时由linux发行版做好了。标准挂载点是/sys/fs/cgroup,可以变更。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    mount -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 上
  2. 查看cgroupfs
      cpuset开头的子文件都是由cpuset子系统产生的,其他文件则由Cgroup产生。这里的tasks文件记录了这个Cgroup的所有进程,包括线程。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ls /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
  3. 创建Cgroup
      通过mkdir创建一个新的目录,也就是常见了一个新的Cgroup

    1
    mkdir /sys/fs/cgroup/cpuset/child
  4. 配置Cgroup

      配置这个Cgroup的资源配额,通过以下命令,可以先哲这个Cgroup的进程只能在0号cpu上运行,并且只能在0号内存节点分配内存。

    1
    2
    echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.cpus
    echo 0 > /sys/fs/cgroup/cpuset/child/cpuset.mems
  5. 使能Cgroup

      通过将进程id写进tasks文件,将整个进程移动到Cgroup中,Cgroup真正起作用了

    1
    echo $$ > /sys/fs/cgroup/cpuset/child/tasks # $$表示当前进程id