Linux Cgroup
Cgroup和Namespace类似,也是将进程进行分组,但它的目的和namespace不一样,Namespace是为了隔离进程组之间的资源,而Cgroup是为了对一组进程进行统一的资源监控和限制。
它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
在Linux中,Cgroups给用户暴露出来的接口是文件系统,以文件与目录形式组织在/sys/fs/cgroup路径之下。
root@herefree:/sys/fs/cgroup# ls
blkio cpu,cpuacct freezer net_cls perf_event systemd
cpu cpuset hugetlb net_cls,net_prio pids unified
cpuacct devices memory net_prio rdma
- cpu 子系统,主要限制进程的 cpu 使用率。
- cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
- cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
- memory 子系统,可以限制进程的 memory 使用量。
- blkio 子系统,可以限制进程的块设备 io。
- devices 子系统,可以控制进程能够访问某些设备。
- net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
- net_prio — 这个子系统用来设计网络流量的优先级
- freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
- ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace
- hugetlb — 这个子系统主要针对于HugeTLB系统进行限制,这是一个大页文件系统。
如何使用?
在对应子系统下面创建一个目录。
root@herefree:/sys/fs/cgroup/cpu# mkdir container
root@herefree:/sys/fs/cgroup/cpu# cd container/
root@herefree:/sys/fs/cgroup/cpu/container# ls
cgroup.clone_children cpuacct.usage_percpu_sys cpu.shares
cgroup.procs cpuacct.usage_percpu_user cpu.stat
cpuacct.stat cpuacct.usage_sys notify_on_release
cpuacct.usage cpuacct.usage_user tasks
cpuacct.usage_all cpu.cfs_period_us
cpuacct.usage_percpu cpu.cfs_quota_us
后台写一个死循环脚本,运行起来
while : ; do : ; done &
查看cpu占用
使被该进程组限制的进程每100ms时间只能使用20ms的CPU时间。
echo 20000 > /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us
将被限制进程的PID写入到container组里的task文件。
echo 11036 > /sys/fs/cgroup/cpu/container/tasks
再次查看
对于 Docker 等 Linux 容器项目来说,它们只需要在每个子系统下面,为每个容器创建一个控制组(即创建一个新目录),然后在启动容器进程之后,把这个进程的 PID 填写到对应控制组的 tasks 文件中就可以了。
评论已关闭