cgroup相关

本文深入解析了cgroup机制,介绍了subsystem与hierarchy的概念,详细解释了如何通过挂载cgroup虚拟文件系统来管理和限制进程资源,包括创建与不同subsystem关联的cgroup树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • subsystem 一个subsystem就是一个内核模块,他被关联到一颗cgroup树之后,就会在树的每个节点(进程组)上做具体的操作。subsystem经常被称作"resource controller",因为它主要被用来调度或者限制每个进程组的资源,但是这个说法不完全准确,因为有时我们将进程分组只是为了做一些监控,观察一下他们的状态,比如perf_event subsystem。到目前为止,Linux支持12种subsystem,比如限制CPU的使用时间,限制使用的内存,统计CPU的使用情况,冻结和恢复一组进程等,后续会对它们一一进行介绍。

  • hierarchy 一个hierarchy可以理解为一棵cgroup树,树的每个节点就是一个进程组,每棵树都会与零到多个subsystem关联。在一颗树里面,会包含Linux系统中的所有进程,但每个进程只能属于一个节点(进程组)。系统中可以有很多颗cgroup树,每棵树都和不同的subsystem关联,一个进程可以属于多颗树,即一个进程可以属于多个进程组,只是这些进程组和不同的subsystem关联。目前Linux支持12种subsystem,如果不考虑不与任何subsystem关联的情况(systemd就属于这种情况),Linux里面最多可以建12颗cgroup树,每棵树关联一个subsystem,当然也可以只建一棵树,然后让这棵树关联所有的subsystem。当一颗cgroup树不和任何subsystem关联的时候,意味着这棵树只是将进程进行分组,至于要在分组的基础上做些什么,将由应用程序自己决定,systemd就是一个这样的例子。

 

实际操作

如何使用cgroup

cgroup相关的所有操作都是基于内核中的cgroup virtual filesystem,使用cgroup很简单,挂载这个文件系统就可以了。一般情况下都是挂载到/sys/fs/cgroup目录下,当然挂载到其它任何目录都没关系。

这里假设目录/sys/fs/cgroup已经存在,下面用到的xxx为任意字符串,取一个有意义的名字就可以了,当用mount命令查看的时候,xxx会显示在第一列

  • 挂载一颗和所有subsystem关联的cgroup树到/sys/fs/cgroup

    mount -t cgroup xxx /sys/fs/cgroup
  • 挂载一颗和cpuset subsystem关联的cgroup树到/sys/fs/cgroup/cpuset

    mkdir /sys/fs/cgroup/cpuset
    mount -t cgroup -o cpuset xxx /sys/fs/cgroup/cpuset
  • 挂载一颗与cpu和cpuacct subsystem关联的cgroup树到/sys/fs/cgroup/cpu,cpuacct

    mkdir /sys/fs/cgroup/cpu,cpuacct
    mount -t cgroup -o cpu,cpuacct xxx /sys/fs/cgroup/cpu,cpuacct
  • 挂载一棵cgroup树,但不关联任何subsystem,下面就是systemd所用到的方式

    mkdir /sys/fs/cgroup/systemd
    mount -t cgroup -o none,name=systemd xxx /sys/fs/cgroup/systemd

在很多使用systemd的系统中,比如ubuntu 16.04,systemd已经帮我们将各个subsystem和cgroup树关联并挂载好了

### 解决 Rancher 中与 cgroup 相关错误 #### 调整 cgroup 配置 当遇到 `mkdir /sys/fs/cgroup/memory/kubepods/besteffort/pod no space left on device` 错误时,一种有效的解决方案是调整系统的 cgroup 配置。具体来说,可以通过修改 `/etc/fstab` 文件中的挂载选项来增加 cgroup 层级结构的空间分配。 对于基于 systemd 的系统,可以尝试编辑 `/etc/systemd/system.conf` 和其他相关配置文件,确保启用了必要的 cgroup 控制器: ```ini [Manager] DefaultControllers=cpu,io,memory,pids ``` 此外,重启 systemd 服务可能会使更改生效: ```bash sudo systemctl daemon-reload sudo systemctl restart systemd-cgroups-agent.service ``` #### 清理文件系统 另一种方法涉及清理文件系统以释放空间。这通常意味着删除不必要的日志文件或其他占用大量存储的数据。特别是要关注那些位于 `/var/log` 或者容器镜像所在的目录下的大文件。 为了安全起见,在执行任何删除操作之前应当先备份重要数据,并确认待删对象确实不再需要保留。也可以考虑定期设置自动化的日志轮转策略来预防此类问题的发生[^1]。 #### Python 脚本示例用于创建文件夹 下面给出一段简单的 Python 代码片段用来展示如何在程序内部处理路径创建逻辑而不引发上述提到的那种由于磁盘满而造成的异常情况: ```python import os def create_directory(path): try: if not os.path.exists(path): os.makedirs(path) print(f"Directory {path} created successfully.") except OSError as e: print(f"Failed to create directory at path '{path}'. Error: {e}") create_directory("/tmp/example") ``` 此函数会在指定位置尝试建立新目录;如果目标已存在则不会重复创建也不会抛出异常。它捕获并报告潜在的操作系统层面的问题以便于调试和维护。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值