cgroup,cpu.share参数,测试docker容器进程与系统进程CPU资源占用

编程

测试机器1核,Fedora release 30 (Thirty)

 

根据进程id,查看进程所属cgroup

[username@localhost ~]$ cat /proc/1/cgroup

11:memory:/init.scope
10:pids:/init.scope
9:net_cls,net_prio:/
8:hugetlb:/
7:devices:/init.scope
6:perf_event:/
5:cpuset:/
4:blkio:/
3:cpu,cpuacct:/
2:freezer:/
1:name=systemd:/init.scope
0::/init.scope

 

cgroup根路径为/sys/fs/cgroup

 

系统进程与容器进程抢占CPU时,CPU资源是怎么分配的?

  • 启动一个容器,运行两个进程

[username@localhost ~]$ sudo docker run -it --rm --cpu-shares=512 centos:7 /bin/bash
[root@74983a25bb02 /]# while : ; do : ; done &
[1] 14
[root@74983a25bb02 /]# while : ; do : ; done &
[2] 15

 

查看监控数据

4857 root 20 0 11836 392 0 R 49.5 0.0 0:23.35 bash 
4858 root 20 0 11836 392 0 R 49.5 0.0 0:22.18 bash

容器中的两个进程CPU各占50%

 

  • 启动一个容器,运行两个进程

[username@localhost ~]$ sudo docker run -it --rm --cpu-shares=2048 centos:7 /bin/bash
[root@3767226341e1 /]# while : ; do : ; done &
[1] 14
[root@3767226341e1 /]# while : ; do : ; done &
[2] 15

 

查看监控数据

5055 root 20 0 11836 404 0 R 39.5 0.0 0:31.67 bash 
5056 root 20 0 11836 404 0 R 39.5 0.0 0:30.57 bash 
4857 root 20 0 11836 392 0 R 9.6 0.0 1:35.79 bash 
4858 root 20 0 11836 392 0 R 9.6 0.0 1:34.62 bash

两个容器进程的CPU占比为4:1,跟cpu.shares比值一样

 

查看容器进程所属cgroup

[username@localhost ~]$ cat /proc/5056/cgroup | grep cpuacct 
3:cpu,cpuacct:/system.slice/docker-3767226341e186d3989278c344b89b3a63648aa9b5b3138061ef6d680503caa9.scope

实际路径为/sys/fs/cgroup/cpu/system.slice/docker-3767226341e186d3989278c344b89b3a63648aa9b5b3138061ef6d680503caa9.scope

 

  • 启动2个进程,并设置cgroup为/sys/fs/cgroup/cpu/system.slice

[username@localhost system.slice]$ while : ; do : ; done &
[1] 5152
[username@localhost system.slice]$ while : ; do : ; done &
[2] 5153

echo "5152" | sudo tee -a /sys/fs/cgroup/cpu/system.slice/tasks

echo "5153" | sudo tee -a /sys/fs/cgroup/cpu/system.slice/tasks

[username@localhost system.slice]$ cat /sys/fs/cgroup/cpu/system.slice/tasks
5152
5153

 

查看监控数据

5055 root 20 0 11836 404 0 R 21.9 0.0 6:11.91 bash 
5056 root 20 0 11836 404 0 R 21.9 0.0 6:10.80 bash 
5152 lianglo+ 20 0 226752 2444 0 R 21.9 0.0 2:41.64 bash 
5153 lianglo+ 20 0 226752 2444 0 R 21.9 0.0 2:43.19 bash 
4857 root 20 0 11836 392 0 R 5.6 0.0 3:00.85 bash 
4858 root 20 0 11836 392 0 R 5.3 0.0 2:59.68 bash

 

下面是cpu资源占用计算方式:

进程号

cpu使用率

cpu.shares值

 

4857

4858 

5.6%

5.6%

512

两个进程cpu.shares相加等于512

/sys/fs/cgroup/cpu/system.slice/docker-3767226341e186d3989278c344b89b3a63648aa9b5b3138061ef6d680503caa9.scope

容器进程

5055 

5056

22%

22%

2048

两个进程cpu.shares相加等于2048

/sys/fs/cgroup/cpu/system.slice/docker-74983a25bb022d56f09de3cf09a7dfa8bccceffec3fb881678ce0f8f1a172c7d.scope

容器进程

5152 

5153 

22%

22%

1024

1024

每个进程cpu.shares都是1024

/sys/fs/cgroup/cpu/system.slice

系统进程,每个进程的cpu.shares值都是1024(相对值,同一层级进程或cgroup)

下面会验证,即使将/sys/fs/cgroup/cpu/system.slice/cpu.shares值改成2048,进程CPU使用率也没有变化。(前提条件:CPU使用率高的进程都在/sys/fs/cgroup/cpu/system.slice下面

 

调大/sys/fs/cgroup/cpu/system.slice/cpu.shares对进程CPU占用有影响吗?

[username@localhost system.slice]$ cat /sys/fs/cgroup/cpu/system.slice/cpu.shares 
1024

 

修改值

[username@localhost system.slice]$ echo 2048 | sudo tee /sys/fs/cgroup/cpu/system.slice/cpu.shares 
2048
[username@localhost system.slice]$ cat /sys/fs/cgroup/cpu/system.slice/cpu.shares 
2048

 

查看监控数据

5055 root 20 0 11836 404 0 R 22.3 0.0 7:56.26 bash 
5056 root 20 0 11836 404 0 R 21.9 0.0 7:55.14 bash 
5152 lianglo+ 20 0 226752 2444 0 R 21.9 0.0 4:25.98 bash 
5153 lianglo+ 20 0 226752 2444 0 R 21.9 0.0 4:27.53 bash 
4857 root 20 0 11836 392 0 R 5.6 0.0 3:26.94 bash 
4858 root 20 0 11836 392 0 R 5.3 0.0 3:25.77 bash

监控数据没有变化

以上是 cgroup,cpu.share参数,测试docker容器进程与系统进程CPU资源占用 的全部内容, 来源链接: utcz.com/z/515629.html

回到顶部