docker 利用 Linux 内核的 cgroup 功能,实现对容器的资源使用限制,通过将容器内的进程 PID号 加入同一个以容器ID为开头命名的cgroup控制组内,实现容器进程的资源限制
验证cgroup对CPU资源的限制
验证当前主机已挂载cgroup
mount -t cgroup

创建控制组 demo
cd /sys/fs/cgroup/cpumkdir demols -l demo #正常创建后demo控制组目录下会生成如cpu.cfs.quota_us 等文件

生成一个CPU占用100%的进程
while true;do : ; done &

该进程会进入死循环,将当前系统cpu使用率堆到100%检查当前cpu使用率,及该进程占用cpu情况
top #top 工具一般为系统自带,用于显示当前系统负载情况

pidstat -p 15028 3 # pidstat 工具可通过sysstat包安装,此处 -p 15028 表示查询PID为15028的进程, 3 表示每3秒显示一次

通过 pidstat 工具确认是该进程导致系统CPU升高,该进程CPU占用为100%
将该进程加入demo控制组,并限制cpu使用率为20%
demo控制组下还未设置cpu限制,所以 cpu.cfs_quota_us 值为 -1
cat cpu.cfs_quota_uscat cpu.cfs_period_us

cpu.cfs_period_us 值为 100000ns 表示 100ms 内该控制组下进程可以使用的CPU时间
cpu.cfs_quota_us 值为 -1 表示当前demo控制组下进程组在100ms内可以使用的cpu时间无限制
b. 将 cpu.cfs_quota_us 修改为 20000,并将 15028 这个 PID加入到demo控制组
echo 20000 > cpu.cfs_quota_usecho 15028 > tasks

cpu.cfs_quota_us 配置为 20000ns (20ms) 表示 100ms 内该控制组下进程可以使用20ms的cpu时间,相当于限制该进程组下的进程可以使用20%的CPU资源c. 验证进程CPU占用是否降低到20%

top

Docker对容器的资源限制
Docker会在每个可使用cgroup限制的资源内创建一个docker目录(相当于创建一个Docker控制组),并在Docker控制组内为每个容器创建一个独立的控制组,容器启动后,将容器的进程ID 加入到tasks路径下,实现对容器的资源限制,如下截图展示了demo容器内内存限制为512M的情况
