今天尝试了一下使用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步:先运行top命令。
第2步:在另一个终端,运行main进程。
[root@workstation cpu-02]# ./main
开始计算...
计算已完成,耗时: 3.469676123 秒
可以看到程序耗时,3.4秒。
再看到top命令中,有一瞬间展示如下,CPU使用63.5%:
操作步骤如下:
第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
简单解释一下这两个参数:
第4步:使用cgexec命令,把上面的main程序放入到cgroup中运行。
[root@workstation cpu-02]# cgexec -g cpu:hello_cpu ./main
开始计算...
计算已完成,耗时: 38.181896997 秒
可以看到,运行的时间长很多,大约为原来的10倍左右(原来是3.4秒)。
运行期间,在top命令中,观察到其使用CPU 稳定在10%左右。
cgroup 是 Linux 内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。它是由 Google 的两位工程师进行开发的,自 2008 年 1 月正式发布的 Linux 内核 v2.6.24 开始提供此能力。
cgroup 到目前为止,有两个大版本, cgroup v1 和 v2 。以下内容以 cgroup v2 版本为主,涉及两个版本差别的地方会在下文详细介绍。
cgroup 主要限制的资源是:
CPU内存网络磁盘 I/O当我们将可用系统资源按特定百分比分配给 cgroup 时,剩余的资源可供系统上的其他 cgroup 或其他进程使用。
参考:
彻底搞懂容器技术的基石: cgroup_张晋涛-MoeLove的博客-CSDN博客