1\。码头工人资源限制

Docker 的运行依赖于内核中的两个特性,命名空间和 CGroups。默认情况下,容器没有资源限制,因此它可以耗尽宿主机上内核分配给容器的所有资源。因此,为了防止一个容器耗尽宿主机的所有资源,需要使用资源约束。资源限制的某些特性需要 Linux 内核支持 Linux Capabilities。 docker 1.13版本之前,只支持CFS调度(Completely Fair Scheduler),以后的版本也支持实时调度。

CFS调度:每个进程都有优先级,非实时进程的优先级从100到139。CSF调度用于调度这些非实时进程。优先进程首先由cpu执行。

realtime schedule:实时进程调度程序,优先级为 0-99。 realtime schedule 是一种特殊的调度器,用于调度实时进程。

2\。 Docker 的内存和 cpu 资源限制

1\。 CPU 限制

- cpusu003d<value>:指定一个容器可以使用多少可用的 CPU 资源。如果是4核cpu,可以设置为1.5,那么容器最多只能使用1.5核CPU资源。如果不是set-cpuset-cpus,可以使用的1.5-core可以是任意一种core资源。该选项只能在 docker 1.3 以上的版本中使用

-- cpu-shares:按比例分配CPU资源给容器。如果其他容器的 CPU 资源空闲,容器 1 将根据需要使用所有 CPU 资源,并将任务分配给任何核心处理。

- cpuset-cpus:指定哪些cpu核心可以用于容器。如果 CPU 是 4 和 3,那么根据数字 0-3 来区分每个内核。该参数设置为0,1,表示可以使用第一核和第二核。

2\。内存和交换限制

Memoru003d<value>:指定容器可以使用的最大内存量,如果一个进程使用的内存超过限制,它可能会被kill掉。

Memor-swap:指定容器可用的最大交换空间。此选项必须与 --memory 参数一起使用。如果不设置 --memory 参数,则不会生效。

内存交换:在设置容器时使用交换的倾向如何,0-100?

memory-reservation:容器使用内存的软限制,即必须设置为小于内存。当系统内存紧张时,容器的内存值-预留值的内存会被回收,容器的内存使用会降低到预留标准。

-- oom-kill-disable:容器内部进程发生oom时是否杀死容器

3\。使用压力测量工具进行测试

[root@bogon ~]# docker pull lorel/docker-stress-ng

使用默认标签:最新

最新:从 lorel/docker-stress-ng 中提取

c52e3ed763ff:拉取完成

a3ed95caeb02:拉动完成

7f831269c70e:拉动完成

达格萨: : 869

状态:为 lorel/docker-stress-ng:latest 下载更新的图像

1\。测试记忆

1.1。 cpu使用没有限制

[root@bogon ~]# docker container run --name stress -it --rm lorel/docker-stress-ng:latest --cpu 8

stress-ng: info: [1] 默认为每个压力源运行 86400 秒

压力-ng:信息:[1] 调度猪:8 cpu

[root@bogon ~]# docker stats

容器ID名称CPU%MEM使用/limit MEM%net I/O块I/O PIDS

92b0b8d916c1 压力 101.54% 15.81MiB / 1.61% 648B / 0B 0B / 0B

[root@bogon ~]#顶部

顶部 - 19:15:49 UP 2天2:38,2用户,负载平均:7.02,3.00,1.15

任务:总共 131 个,跑步 10 个,睡觉 121 个,停止 0 个,僵尸 0 个

%Cpu(s):99.7 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB 内存:总计 1006892,免费 100680,已使用 320704,585508 buff/缓存

KiB 交换:总计 2097148,免费 2096628,已使用 520。 422732 可用内存

PID USER PR NI VIRT RES SHR S %CPU %MEM 时间+ 命令

40035 根 20 0 6908 4180 252 R 12.6 0.4 0:12.79 应力-ng-cpu

40037 根 20 0 6908 4180 252 R 12.6 0.4 0:12.78 应力-ng-cpu

40038 根 20 0 6908 2136 252 R 12.6 0.2 0:12.78 应力-ng-cpu

40040 根 20 0 6908 2136 252 R 12.6 0.2 0:12.78 应力-ng-cpu

40036 根 20 0 6908 2136 252 R 12.3 0.2 0:12.77 应力-ng-cpu

40039 根 20 0 6908 2136 252 R 12.3 0.2 0:12.78 应力-ng-cpu

40041 根 20 0 6908 4180 252 R 12.3 0.4 0:12.77 应力-ng-cpu

40042 根 20 0 6908 2136 252 R 12.3 0.2 0:12.77 应力-ng-cpu

1 根      20   0  128484   7208   4196 S  0.0  0.7   0:10.12 systemd

如您所见,cpu使用率已满

1.2.重启容器添加内存限制参数

[root@bogon ~]# docker container run --name stress --cpusu003d0.5 -it --rm lorel/docker-stress-ng:latest --cpu 8

stress-ng: info: [1] 默认为每个压力源运行 86400 秒

压力-ng:信息:[1] 调度猪:8 cpu

[root@bogon ~]# docker stats

容器ID名称CPU%MEM使用/limit MEM%net I/O块I/O PIDS

845220EF9982应力51.57%20.05MIB/983.3MIB 2.04%648B/0B 0B/0B/0B 9

设置的参数生效

2\。测试记忆

2.1。内存使用没有限制。压力测量指定两个内存,每个 128m。

[root@bogon ~]# docker container run --name stress -it --rm lorel/docker-stress-ng:latest --vm 2 --vm-bytes 128m

stress-ng: info: [1] 默认为每个压力源运行 86400 秒

压力-ng:信息:[1] 调度猪:2 vm

[root@bogon ~]# docker stats

容器ID名称CPU%MEM使用/limit MEM%net I/O块I/O PIDS

beb3cfa10748 压力 99.29% 256.2MiB / 983.3MiB 26.05% 648B / 0B

事实上,使用了 256M 内存。

2.2.重启容器并添加内存限制

--Memory 将容器限制为 128m 内存

[root@bogon ~]#docker container run --name stress -it --memoryu003d128m --rm lorel/docker-stress-ng:latest --vm 2 --vm-bytes 128m

stress-ng: info: [1] 默认为每个压力源运行 86400 秒

压力-ng:信息:[1] 调度猪:2 vm

[root@bogon ~]# docker stats

容器ID名称CPU%MEM使用/limit MEM%net I/O块I/O PIDS

DECEE18CB471应力99.47%126.4MIB/128MIB 98.77%648B/0B 3.19MB/461MB 5

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐