使用cgroup限制进程的cpu资源

     今天尝试了一下使用cgroup (control group)来限制进程对CPU时间的使用。对于一个计算密集型的进程,要求只能使用10%的CPU时间。

准备工作:

1)准备一台CentOS 7服务器。

2)安装go环境。

3)安装cgexec命令。

 
[root@workstation cpu-01]# yum install libcgroup-tools.x86_64 -y
Loaded plugins: fastestmirror
Determining fastest mirrors
epel/x86_64/metalink                            | 9.5 kB     00:00     
 * epel: mirror.01link.hk
base                                            | 3.6 kB     00:00     
docker-ce-stable                                | 3.5 kB     00:00     
epel                                            | 4.7 kB     00:00     
extras                                          | 2.9 kB     00:00     
jenkins                                         | 2.9 kB     00:00     
kubernetes                                      | 1.4 kB     00:00     
updates                                         | 2.9 kB     00:00     
(1/4): epel/x86_64/updateinfo                     | 1.0 MB   00:01     
(2/4): epel/x86_64/primary_db                     | 7.0 MB   00:01     
(3/4): updates/7/x86_64/primary_db                |  15 MB   00:04     
(4/4): jenkins/primary_db                         |  41 kB   00:28     
Resolving Dependencies
--> Running transaction check
---> Package libcgroup-tools.x86_64 0:0.41-21.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=======================================================================
 Package               Arch         Version           Repository  Size
=======================================================================
Installing:
 libcgroup-tools       x86_64       0.41-21.el7       base        99 k

Transaction Summary
=======================================================================
Install  1 Package

Total download size: 99 k
Installed size: 257 k
Downloading packages:
libcgroup-tools-0.41-21.el7.x86_64.rpm            |  99 kB   00:00     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : libcgroup-tools-0.41-21.el7.x86_64                  1/1 
  Verifying  : libcgroup-tools-0.41-21.el7.x86_64                  1/1 

Installed:
  libcgroup-tools.x86_64 0:0.41-21.el7                                 

Complete!
[root@workstation cpu-01]# 
[root@workstation cpu-01]# 

4) 编写一个"计算密集型"的go程序,打印运行时间,并编译成二进制可执行文件。

[root@workstation cpu-02]# cat main.go 
package main
import (
	"fmt"
        "time"
)
func main(){
	fmt.Println("开始计算...")
	start := time.Now()
        n := 1024 * 1024 * 1024 * 4
        for i:=0; i

接下来,我们做两次测试,看看使用cgroup前、后的效果。

测试1):使用cgroup之前

操作步骤:

第1步:先运行top命令。

第2步:在另一个终端,运行main进程。

[root@workstation cpu-02]# ./main 
开始计算...
计算已完成,耗时: 3.469676123 秒

可以看到程序耗时,3.4秒。

再看到top命令中,有一瞬间展示如下,CPU使用63.5%:

使用cgroup限制进程的cpu资源_第1张图片

测试2):使用cgroup之后

操作步骤如下:

第1步:创建cgroup子系统。

mkdir /sys/fs/cgroup/cpu/hello_cpu

创建后,系统会自动生成一堆文件:

[root@workstation cpu-02]# ll /sys/fs/cgroup/cpu/hello_cpu
total 0
-rw-r--r-- 1 root root 0 Apr 13 21:41 cgroup.clone_children
--w--w--w- 1 root root 0 Apr 13 21:41 cgroup.event_control
-rw-r--r-- 1 root root 0 Apr 13 21:41 cgroup.procs
-r--r--r-- 1 root root 0 Apr 13 21:41 cpuacct.stat
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpuacct.usage
-r--r--r-- 1 root root 0 Apr 13 21:41 cpuacct.usage_percpu
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpu.cfs_period_us
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpu.cfs_quota_us
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpu.rt_period_us
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpu.rt_runtime_us
-rw-r--r-- 1 root root 0 Apr 13 21:41 cpu.shares
-r--r--r-- 1 root root 0 Apr 13 21:41 cpu.stat
-rw-r--r-- 1 root root 0 Apr 13 21:41 notify_on_release
-rw-r--r-- 1 root root 0 Apr 13 21:41 tasks
[root@workstation cpu-02]# 

第2步:配置cgroup子系统,设置只能使用10%的CPU时间片。

修改cup.cfs_period_us, cpu.cfs_quota_us两个文件。

[root@workstation hello_cpu]# echo 100000 > cpu.cfs_period_us
[root@workstation hello_cpu]# echo 10000 > cpu.cfs_quota_us 

 简单解释一下这两个参数:

使用cgroup限制进程的cpu资源_第2张图片

 

第4步:使用cgexec命令,把上面的main程序放入到cgroup中运行。

[root@workstation cpu-02]# cgexec -g cpu:hello_cpu ./main
开始计算...
计算已完成,耗时: 38.181896997 秒

可以看到,运行的时间长很多,大约为原来的10倍左右(原来是3.4秒)。


运行期间,在top命令中,观察到其使用CPU 稳定在10%左右。

使用cgroup限制进程的cpu资源_第3张图片

附录:

cgroup 是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。它是由 Google 的两位工程师进行开发的,自 2008 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。

cgroup 到目前为止,有两个大版本, cgroup v1 和 v2 。以下内容以 cgroup v2 版本为主,涉及两个版本差别的地方会在下文详细介绍。

cgroup 主要限制的资源是:

CPU内存网络磁盘 I/O当我们将可用系统资源按特定百分比分配给 cgroup 时,剩余的资源可供系统上的其他 cgroup 或其他进程使用。

使用cgroup限制进程的cpu资源_第4张图片

参考:
彻底搞懂容器技术的基石: cgroup_张晋涛-MoeLove的博客-CSDN博客

你可能感兴趣的:(云原生底层原理,云计算)