docker资源限制主要针对
1、内存
2、CPU
1.默认情况下,容器没有资源限制;docker提供了可以限制容器使用多少内存或CPU方法
设置docker run命令时配置标志
2.对于linux主机来说,若是没有足够的内容执行其它系统任务,将会抛出OOM(out of Memory Exception,内存溢出、内存泄漏、内存异常)
系统会自动杀死进程以释放内存空间;
dockerd会调整docker守护进程程序的PPM优先级来减轻风险
OOM优先级机制(分数高的会优先被kill)
1、范围-1000-1000,设置-1000则永远不会被宿主机kernel kill
/proc/PID/oom_score_adj
2、范围-17-+15,设置-17不能被kill,此参数存在为了和旧版本linux内核兼容
/proc/PID/oom_adj
3、系统综合进程的内存消耗量、CPU时间(utime+stime)、存货时间(utime-start time)和oom_adj计算出的进程得分
/proc/PID/oom_score
问题:net.ifnames用途
vim /etc/default/grub
net.ifnames=1 (GRUB_CMDLINE_LINUX行添加或修改)
1、容器的内存限制
1. 硬性内存限制:不执行硬性限制内存限制,则容器会可以使用尽可能多的内存
2. 非硬性内存限制:只允许容器使用给定的内存大小
0、--oom-kill-disable # 不会被系统kill掉;关闭om机制
--oom-score-adj # 不推荐手动指定,设置容器的评分
1、内存限制参数:
1)-m or --memory= # 容器可以使用的最大内存两,最小为4M,内存限制
2)-memory-swap # 容器可使用的交换分区大小(必须设置物理机内存限制前提下才能设置)
3)--memory-swappiness # 设置容器使用交换分区的倾向性,(能不用就不用)0-100(能用就用)
4)--memory-reservation # 允许指定小于--memory的软限制,不能保证容器不超过限制(必须设置小于--memory)
5)--oom-kill-disable # 指定容器不会被系统kill掉;关闭om机制(设置-m的前提下)
2、swap限制(不建议使用,设置-m的前提下使用)
-memory-swap #可以让容器超出限制的部分内存置换到磁盘上,会降低性能
1)值为正数,则--memory和--memory-swap必须都设置
表示能使用的内存和swap分区大小总和
2)设置为0,忽略该设置
3)等于--memory值,--memory为正整数,则没有设置交换分区
4)设置为unset,宿主机开启swap。则容器是2*--memory,两倍的物理内存大小
5)设置-1,可以使用宿主机swap的最大空间
3、内存限制验证
1)docker pull lorel/docker-stress-ng # 压力测试镜像
2)docker run --rm -it lorel/docker-stress-ng --help # 查看帮助信息
内存大小硬限制
1、开启两个工作进程,每个工作进程最大允许256M内存,且宿主机不限制当前容器最大内存
docker run -it --rm --name szb lorel/docker-stress-ng --vm 2 --vm-bytes 256M
docker stats # 查看容器进程状态

2、宿主机限制当前容器最大内存
docker run -it --rm -m 256m --name szb lorel/docker-stress-ng --vm 2 --vm-bytes 256M
docker stats

宿主机cgroup验证
宿主机基于cgroup对容器进行内存资源大小限制;可以echo增大内存限制,缩小会报错
cat /sys/fs/cgroup/memory/docker/容器id/memory.limit_in_bytes
268435456 # 等价于256M
内存大小软限制
docker run -it --rm -m 256m --memory-reservation 128m --name szb lorel/docker-stress-ng --vm 2 --vm-bytes 256M
docker stats
[root@szb ~]# cat /sys/fs/cgroup/memory/docker/容器id/memory.soft_limit_in_bytes
134217728 # 128M
关闭OOM机制
docker run -it --rm -m 256m --oom-kill-disable --name szb lorel/docker-stress-ng --vm 2 --vm-bytes 256M
docker stats
[root@szb ~]# cat /sys/fs/cgroup/memory/docker/容器id/memory.oom_control
oom_kill_disable 1
under_oom 1
交换分区限制
docker run -it --rm -m 256m --memory-swap 512m --name szb centos bash
docker stats
[root@szb ~]# cat /sys/fs/cgroup/memory/docker/容器id/memory.memsw.limit_in_bytes
536870912
2、容器的CPU限制
1. 一个核心的CPU可以调度多个进程,但是同一个单位时间只能有一个进程在cpu上运行
2. 优先级:
1)实时优先级 0-99
2) 非实时优先级(nice):-20-19,对应100-139进程优先级
3. 内核基于CFS(completely fair sschheduler),完全公平调度
4. 密集型场景:
1)CPU密集,优先级越低越好,cpu的运算能力
2)IO密集,优先级高点,web应用、高并发、数据量大的动态网站来说;IO速度远远低于cpu和内存速度
磁盘的调度算法
[root@szb ~]# cat /sys/block/vda/queue/scheduler
[mq-deadline] kyber none
cpu实时优先级设置
--cpus # 指定容器可以使用多少可用的cpu资源
不能超出宿主机的cpu核数:
[root@szb ~]# docker run -it --rm --cpus 3 centos bash
docker: Error response from daemon: Range of CPUs is from 0.01 to 2.00, as there are only 2 CPUs available.
See 'docker run --help'.
参数
--cpuset-cpu # 指定容器运行的cpu编号
--cpuset-mem # 设置使用哪个cpu的内存
--cpuset-shares # 用于设置cfs中调度相对最大比例权重,越高,分的时间片越多,默认1024,最大262144
未限制容器CPU
分配2核cpu并启动2个工作进程
docker run -it --rm --name szb lorel/docker-stress-ng --cpu 2 --vm 2
[root@szb ~]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1 # cpu限制参数

宿主机cpu利用率

限制容器CPU
分配容器1核宿主机cpu利用率:
docker run -it --rm --name szb --cpus 1 lorel/docker-stress-ng --cpu 2 --vm 2
[root@szb ~]# cat /sys/fs/cgroup/cpu,cpuacct/docker/容器id/cpu.cfs_quota_us
100000 # 按照1000为单位转换为百分比,100%
注意:cpu资源限制是将分配给容器1核分配到宿主机每一核心cpu上,也就是容器总cpu是在宿主机每一个核心cpu分配的部分比例。


将容器运行到指定cpu上
--cpuset-cpus # CPUs in which to allow execution (0-3, 0,1)
docker run -it --rm --name szb --cpus 1 --cpuset-cpus 1 lorel/docker-stress-ng --cpu 2 --vm 2

基于 --cpu-shares 对cpu进行切分
-c, --cpu-shares int CPU shares (relative weight)
值越大,cpu利用率占比越高,根据值成比例,在宿主机cgroup动态修改
示例:
eg1:
docker run -it --rm --name szb01 --cpu-shares 1000 lorel/docker-stress-ng --cpu 2 --vm 2
eg2:
docker run -it --rm --name szb02 --cpu-shares 500 lorel/docker-stress-ng --cpu 2 --vm 2

szb01:
[root@szb ~]# cat /sys/fs/cgroup/cpu,cpuacct/docker/容器id01/cpu.shares
1000
szb02:
[root@szb ~]# cat /sys/fs/cgroup/cpu,cpuacct/docker/容器id02/cpu.shares
500
本文介绍了Docker容器的资源限制,包括内存和CPU。内容涵盖内存的软限制、关闭OOM机制、交换分区限制,以及CPU的未限制与限制情况,详细解析了--cpu-shares参数在容器CPU切分中的应用。
2206

被折叠的 条评论
为什么被折叠?



