Linux cgroups详细介绍
什么是cgroups
cgroups(control groups)是Linux内核提供的一种机制,它允许你限制、分配和监控系统资源(如CPU、内存、磁盘IO等)的使用。cgroups可以通过文件系统的形式,将一组进程放置在一个子系统中。
cgroups的应用场景
cgroups常用于以下场景:
- 系统性能优化:通过控制资源的使用限制,可以防止进程对系统资源的滥用,防止系统崩溃等问题;
- 服务管理:通过控制某一组进程可以使用的资源范围,可以保证服务的稳定性;
- 可靠性解决方案:在多租户环境下使用cgroups,可以避免一个用户的资源使用情况影响其他用户的使用体验。
cgroups的实现
cgroups操作需要对操作系统内核的进程处理进行控制,因此cgroups的实现离不开内核对进程管理的处理。目前Linux内核中已经内置了cgroups子系统(以cgroups_v1为主)。
对于cgroups的实现,常用的cgroups子系统有:
- blkio:控制块设备IO的限制,如硬盘和闪存;
- cpuacct:使用cgroups的进程所消耗的CPU资源(cache、用户时间、系统时间)的统计;
- cpu:对进程使用CPU限制和权重的控制;
- devices:禁止特定类型的设备和允许特定设备访问的控制;
- freezer:暂停和恢复cgroup中的所有进程;
- memory:内存使用情况的控制和统计;
- net_cls:为网络流量分类提供标记;
cgroups的基本操作
创建cgroup
基于内核版本的不同,cgroups相关的文件系统可能会存在差异。在本文中,我们以基于cgroups v1的文件系统示例来演示如何操作。
首先,我们需要选择一个cgroup子系统,这里选取cpu子系统作为示例:
$ mkdir /sys/fs/cgroup/cpu/test-cgroup
这个命令会在路径/sys/fs/cgroup/cpu
中创建一个名为test-cgroup
的cgroup。
限制资源使用
限制进程组的CPU使用率为50%:
$ echo 50000 > /sys/fs/cgroup/cpu/test-cgroup/cpu.cfs_quota_us
$ echo 100000 > /sys/fs/cgroup/cpu/test-cgroup/cpu.cfs_period_us
这条命令中,我们指定了test-cgroup
子系统在进程组中最多只能利用50%的CPU时间。
进程加入cgroup
将一个进程加入cgroup:
$ echo <pid of process> > /sys/fs/cgroup/cpu/test-cgroup/tasks
例如,通过下面的命令将PID为123
的进程加入test-cgroup
子系统下的cgroup:
$ echo 123 > /sys/fs/cgroup/cpu/test-cgroup/tasks
监控cgroup
使用cgtop
命令可以使用CPU、内存和网络方面的统计信息监控cgroup:
$ apt install -y libcgroup-tools
$ cgtop
这个命令可以显示出所有cgroups的所有进程的统计信息。
示例1:限制进程组的CPU使用
假设我们要运行shell脚本test.sh
,同时要限制其所用的CPU使用,并将其加入名为test
的cgroup。
首先,我们创建一个名为test
的cgroup:
$ mkdir /sys/fs/cgroup/cpu/test
然后,我们限制test
子系统在进程组中最多只能利用50%的CPU时间:
$ echo 50000 > /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us
$ echo 100000 > /sys/fs/cgroup/cpu/test/cpu.cfs_period_us
接着,我们将脚本test.sh
运行在名为test
的cgroup下:
$ bash test.sh &
$ echo $! > /sys/fs/cgroup/cpu/test/tasks
这个命令行会在后台运行脚本test.sh
,并将它的PID加入名为test
的cgroup。现在,这个脚本的CPU使用率不会超过50%。
示例2:限制Docker容器的内存使用
我们还可以使用cgroups限制Docker容器的内存使用。例如,我们可以将一个名为test-container
的Docker容器利用内存限制为2G:
$ docker run -itd --name test-container ubuntu:18.04 /bin/bash
$ cgcreate -g memory:/docker-test
$ echo $(( 2 * 1024 * 1024 * 1024 )) > /sys/fs/cgroup/memory/docker-test/memory.limit_in_bytes
$ echo $(docker inspect -f '{{.State.Pid}}' test-container) > /sys/fs/cgroup/memory/docker-test/tasks
这个命令运行了容器,并创建了一个名为docker-test
的cgroup。这个cgroup限制了该容器的内存使用为2GB。最后,我们使用docker inspect
取得容器的PID,并将其加入docker-test
的cgroup。
这种方法也可以运用到限制其他资源(CPU、IO、网络等)的使用上。
总结
cgroups帮助我们管理Linux系统上进程的资源使用,使用cgroups可以实现进程级别的资源限制,提高系统的可用性及稳定性。本文介绍了cgroups的基本概念及其应用场景,并提供了两个例子来进一步说明如何使用cgroups操作系统相关资源。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux cgroups详细介绍 - Python技术站