1. 了解Cgroup

cgroups的全称是Linux Control Groups,主要作用是限制、记录和隔离进程组(process groups)使用的物理资源(cpu、memory、IO等)

Cgroup提供了一个原生接口并通过cgroupfs提供(cgroupfs就是Cgroup的一个借口封装)。类似于procfs和sysfs,是一种虚拟文件系统。并且cgroupfs是可以挂载的,默认情况下挂载在/sys/fs/cgroup目录。

Systemd也是对于Cgroup接口的一个封装。systemd以PID1的形式在系统启动的时候运行,并提供了一套系统管理守护程序、库和实用程序,用来控制、管理Linux计算机操作系统资源。通过systemd-cgls命令我们可以看到systemd工作的进程PID是1,而目录/sys/cgroup/systemd/是systemd维护的自己使用的非subsystem的cgroups层级结构。

2. 对容器内存的限制

运行一个容器,不限制的情况下压测

1
nerdctl run -d --name=c1 --restart=always centos sleep 1d

安装压测工具

1
2
3
4
5
6
nerdctl cp memload-7.0-1.r29766.x86_64.rpm c1:/opt/
[root@control ~]# nerdctl exec -it c1 bash
[root@ab3af419f53a /]# cd /opt/
[root@ab3af419f53a opt]# rpm -ivh memload-7.0-1.r29766.x86_64.rpm
[root@ab3af419f53a /]# memload 1000
[root@control ~]# nerdctl stats

限制资源使用
限制内存使用512mb

1
[root@control ~]# nerdctl run -d --name=c1 --restart=always -m 512m centos sleep 1d

压测

1
[root@ab3af419f53a /]# memload 1000

查看容器资源使用量

3. 对容器CPU亲和性

临时进入容器

1
[root@control ~]# nerdctl run -it --name c1 --rm centos bash

创建3个进程

1
2
3
4
5
6
[root@06f9d93ae4da /]# cat /dev/zero  > /dev/null &
[1] 16
[root@06f9d93ae4da /]# cat /dev/zero > /dev/null &
[2] 17
[root@06f9d93ae4da /]# cat /dev/zero > /dev/null &
[3] 18

进程随机运行到cpu上

1
2
3
4
5
6
7
8
[root@06f9d93ae4da /]# ps mo pid,comm,psr $(pgrep cat)
PID COMMAND PSR
16 cat -
- - 2
17 cat -
- - 0
18 cat -
- - 3

限制容器只能运行在0号cpu

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@control ~]# nerdctl run -it --name c1 --rm --cpuset-cpus 0  centos bash
[root@16215eb83f99 /]# cat /dev/zero > /dev/null &
[1] 15
[root@16215eb83f99 /]# cat /dev/zero > /dev/null &
[2] 16
[root@16215eb83f99 /]# cat /dev/zero > /dev/null &
[3] 17
[root@16215eb83f99 /]# ps mo pid,comm,psr $(pgrep cat)
PID COMMAND PSR
15 cat -
- - 0
16 cat -
- - 0
17 cat -
- - 0