什么是Cgroups

(转自http://pythonic.me/Cgroups.html

cgroups(Control Group)是Linux内核的功能,简单的说,它对进程分组,然后以组为单位进行资源调度和分配,另外还能记录组内进程使用的资源数量(内存、CPU等)。

什么时候要用cgroups

如果一台机器是给多个人共享,对有些用户,你希望多分配一些资源,对另外一些用户,少分配一些资源,这时候就可以用cgroups。如果你想记录某个用户或者进程一共使用了多少资源,也可以使用cgroups。

直观印象

下面的例子中,创建两个cgroup foo和bar,给每个组分配不同的cpu优先级。

所有和cgroups的交互都是通过虚拟文件系统完成的,所以我们要挂载cgroup文件系统,像下面的例子这样。

mount -t cgroup -o cpu cgroups /mnt/cgroup # 挂载,-o参数表示加载哪些子系统(参加后面的子系统解释)

如果执行成功,我们会发现/mnt/cgroup目录下多了几个文件

-rw-r–r– 1 root root 0 Feb 13 04:19 cpu.rt_period_us
-rw-r–r– 1 root root 0 Feb 13 04:19 cpu.rt_runtime_us
-rw-r–r– 1 root root 0 Feb 13 04:19 cpu.shares
-rw-r–r– 1 root root 0 Feb 13 04:19 notify_on_release
-rw-r–r– 1 root root 0 Feb 13 04:19 release_agent
-rw-r–r– 1 root root 0 Feb 13 04:19 tasks

继续

mkdir /mnt/cgroup/foo
mkdir /mnt/cgroup/bar # 创建了两个cgroup foo和bar

设置每个cgroup的参数
echo 100 > /mnt/cgroup/foo/cpu.shares
echo 200 > /mnt/cgroup/bar/cpu.shares

为了测试,我写了下面一段简单的python代码,保存为loop.py

#!/usr/bin/env python

while True:
    pass

然后在两个terminal中分别运行loop.py,两个进程分别占用了大约49%的cpu。此时,它们都不在foot和bar cgroup中。

PID %CPU COMMAND
3722 49.9 python
3723 49.9 python

下面,把进程放入cgroup,就是简单的pid放入cgroup的task文件中。

echo 3722 > foo/cpu.shares
echo 3723 > bar/cpu.shares

立刻,cpu使用率改变了。

PID %CPU COMMAND
3722 65.3 python
3723 32.1 python

看到了吧,使用cgroup就是这么简单:先挂载,再分组,设置好参数,最后把进程扔到对应的组里就行了。

另外,子进程会自动进入父进程的cgroup中

cgroup的一些概念和名词

任务(task ),就是系统的一个进程。
控制组(control cgroup),划分出来的一组task集合,包括它们的设置。比如上面的foo,bar都是控制组。
层级(hierarchy) 控制组是有层次的,比如foo下面还可以建新的控制组,新建的控制组自动继承foo的所有配置。
子系统(subsystem),这个最重要了,一个子系统就是一个资源管理器。比如cpu子系统、内存子系统等等。全部的子系统包括blkio, cpu, cpuacct, cpuset, devices, freezer, memory, net_cls, ns等

持久化cgroups

上面例子中的cgroups配置,重启后就消失了,自然不是实用主义做法。如果想配置永久生效,要使用cgconfig服务,把配置写到/etc/cgcfongi.conf文件中。这里就不多做介绍了,毕竟本文也只是个“简介​​​”而已。


可以使用命令 cgclear 停用Cgroup
在普通的ubuntu系统中默认是没有cgroup功能的,同样也没有lxc功能。虽然这些功能可以协助我们更好的管理系统,但当用criu进行checkpoint/restore工作时,省去这些功能,可以减少不必要的checkpoint,降低失败的概率。
检查是否启用cgroup: lssubsys –all
检查是否启用lxc:lxc-checkconfig

04-01
### CGroups 的定义与功能 CGroups(Control Groups)是 Linux 内核提供的一种机制,用于限制进程组使用的资源(如 CPU、内存、磁盘 I/O 等),并通过将进程组划分为层次结构来实现对系统资源的统一管理和限制[^2]。 ### 资源管理中的应用 YARN 中可以通过配置 `yarn.nodemanager.linux-container-executor.resources-handler.class` 来利用 CGroups 进行容器级别的资源管理[^1]。这使得 YARN 可以更精确地控制每个容器所消耗的计算资源。 #### 实时优先级设置 在 Linux 系统中,`rtprio` 参数与实时优先级相关,Systemd 利用 CGroup 对服务或任务进行资源限制时会涉及该参数[^3]。这意味着管理员可以根据需求调整特定进程的调度优先级,从而优化系统的响应能力。 #### 移动进程至新的 CGroup 要将某个具体进程迁移到一个新的 CGroup 下面只需要简单操作如下命令即可完成迁移工作: ```bash echo 30167 > /path/to/newcgroup/tasks ``` 上述例子展示了如何把 PID 为 30167 的进程转移到指定路径下的新 CGroup 当中去[^4]。 ### NUMA 架构支持 对于高性能计算环境而言,CPUs 和 Memories 经常被组织成多个独立但相互连接起来形成整个计算机体系结构的一部分——即所谓的 Non-Uniform Memory Access (NUMA) 结构。在这种情况下 cpuset 子系统允许我们进一步细化哪些 CPUs 或者 memories 应当分配给某些应用程序运行期间独占使用;同时也要注意避免不必要的跨 NUMAs 数据交换因为那通常意味着更高的延迟成本以及更低效率的操作模式[^5]。 ### 示例代码展示创建并配置基本 CGroup 下面是一个简单的 Python 脚本来演示怎样程序化地建立一个名为 'my_cgroup' 的 cpu controller 类型 cgroup 并为其设定最大可用百分比: ```python import os def create_and_configure_cgroup(cg_name, max_cpu_percent): base_path = "/sys/fs/cgroup/cpu" # 创建目录 cg_dir = f"{base_path}/{cg_name}" if not os.path.exists(cg_dir): os.mkdir(cg_dir) # 设置cpu配额 with open(f"{cg_dir}/cpu.cfs_quota_us", "w") as quota_file: quota_value = int(max_cpu_percent * 100000) quota_file.write(str(quota_value)) create_and_configure_cgroup('my_cgroup', 0.5) # 配置 my_cgroup 占用最多 50% 的 CPU 时间片 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值