文章目录
- 容器资源限制
- 示例
- OOM 优先级机制
- 内存限制参数
- swap 限制
容器资源限制
Docker提供了多种资源限制的方式,可以根据应用程序的需求和系统资源的可用性进行选择。以下是一些常见的Docker资源限制及其使用情况:
CPU限制:通过设置CPU的配额(quota)和周期(period),可以限制容器使用的CPU时间片。这种资源限制在大多数情况下被广泛使用,以确保容器之间公平地共享CPU资源。
内存限制:通过设置容器的最大内存限制,可以限制容器使用的物理内存量。这对于避免容器过度消耗系统内存并导致系统崩溃非常有用。
网络带宽限制:可以使用Docker网络驱动程序设置容器的网络带宽限制。这对于保证网络资源的公平分配以及限制容器对网络的占用非常有用。
磁盘IO限制:可以使用I/O调度程序或限制磁盘带宽来限制容器的磁盘IO。这对于避免容器对磁盘资源的过度占用以及确保系统磁盘性能的稳定性非常重要。
GPU限制:对于需要使用GPU资源的容器,可以使用专门的GPU管理工具(如NVIDIA Docker)来限制容器对GPU的访问。
在实际应用中,CPU和内存限制是最常见的资源限制方式,因为它们可以直接影响容器的性能和稳定性。但具体使用哪种资源限制最多还是要根据应用场景和需求来决定。不同的应用可能对不同的资源有不同的需求,因此在使用Docker时需要根据具体情况进行调整和优化。
当容器内存资源不足时,Linux内核会使用Out of Memory(OOM)机制选择一个或多个进程进行杀死,以释放内存。如果你希望在容器内存不足时禁用OOM,可以通过以下方式进行设置:
在运行容器时设置--oom-kill-disable参数:
docker run --oom-kill-disable my-container
这将禁用容器的OOM机制,使其在内存不足时不会被自动终止。
在容器中设置oom_score_adj值:
在容器内部,你可以使用echo命令将oom_score_adj设置为一个较高的值,表示容器对OOM机制的“免疫力”更强。
echo -1000 > /proc/self/oom_score_adj
这将使得容器内的进程在OOM发生时更不可能被选中终止。
请注意,禁用OOM机制可能会导致内存问题进一步扩大,可能导致系统性能下降或容器崩溃。因此,在实际应用中,建议根据实际情况和需求来权衡是否禁用OOM机制,并确保适当的内存资源可供容器使用。
主要是限制 cpu 和 内存,磁盘io 限制没有用
cpu是可压缩性资源
内存不是可压缩性资源
oom_adj 调整可以避免oom 的出现
--oom-kill-disable
示例
当使用Docker时,最常用的资源限制是CPU和内存限制。以下是它们的简要说明:
CPU资源限制:
--cpus:通过设置该参数,可以限制容器可以使用的CPU核心数。例如,使用--cpus=2表示容器最多可以使用2个CPU核心。
--cpu-shares:通过设置该参数,可以为容器分配CPU时间片的相对权重。较高的权重值表示容器将获得更多的CPU时间。默认情况下,所有容器的权重值相等。
内存资源限制:
--memory:通过设置该参数,可以限制容器可以使用的物理内存量。例如,使用--memory=4g表示容器最多可以使用4GB的内存。
--memory-swap:通过设置该参数,可以限制容器可以使用的交换空间(swap)。例如,使用--memory-swap=8g表示容器最多可以使用8GB的交换空间,这包括实际内存和交换空间的总和。
这些参数可以在运行容器时通过docker run命令进行设置,例如:
docker run --cpus=2 --memory=4g my-container
这样就会限制容器只能使用2个CPU核心和最多4GB的内存。
需要注意的是,CPU和内存的资源限制应根据实际需求进行调整,以确保容器能够正常工作并且不过度占用系统资源。根据应用程序的要求和系统的可用资源,可以灵活地设置适当的限制。
OOM 优先级机制
/proc/PID/oom_score_adj #范围为-1000 到 1000,值越高越容易被宿主机
kill 掉,如果将该值设置为-1000,则进程永远不会被宿主机 kernel kill。
/proc/PID/oom_adj #范围为-17 到+15,取值越高越容易被干掉,如果是-17,
则表示不能被 kill,该设置参数的存在是为了和旧版本的 Linux 内核兼容。
/proc/PID/oom_score #这个值是系统综合进程的内存消耗量、CPU 时间
(utime + stime)、存活时间(uptime - start time)和 oom_adj 计算出的进程得
分,消耗内存越多得分越高,越容易被宿主机 kernel 强制杀死
内存限制参数
-m or --memory #容器可以使用的最大内存量,如果设置此选项,则允许的
最小存值为 4m (4 兆字节)
--memory-swap #容器可以使用的交换分区大小,必须要在设置了物理内存
限制的前提才能设置交换分区的限制
--memory-swappiness #设置容器使用交换分区的倾向性,值越高表示越倾
向于使用 swap 分区,范围为 0-100,0 为能不用就不用,100 为能用就用。
--kernel-memory #容器可以使用的最大内核内存量,最小为 4m,由于内核
内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不
足的容器可能会阻塞宿主主机资源,这会对主机和其他容器或者其他服务进程产
生影响,因此不要设置内核内存大小
--oom-kill-disable #默认情况下,发生 OOM 时,kernel 会杀死容器内进程,
但是可以使用--oom-kill-disable 参数,可以禁止 oom 发生在指定的容器上,
即 仅在已设置-m / - memory 选项的容器上禁用 OOM,如果-m 参数未配
置,产生 OOM 时,主机为了释放内存还会杀死系统进程。
--memory-reservation #允许指定小于--memory 的软限制,当 Docker
检测到主机上的争用或内存不足时会激活该限制,如果使用
--memory-reservation,则必须将其设置为低于--memory 才能使其优先。 因
为它是软限制,所以不能保证容器不超过限制
swap 限制
--memory-swap #只有在设置了 --memory 后才会有意义。使用 Swap,可
以让容器将超出限制部分的内存置换到磁盘上,WARNING:经常将内存交换到
磁盘的应用程序会降低性能
--memory-swap #值为正数, 那么--memory 和--memory-swap 都必须要
设置,--memory-swap 表示你能使用的内存和 swap 分区大小的总和,例如:
--memory=300m, --memory-swap=1g, 那么该容器能够使用 300m 内存和
700m swap,即--memory 是实际物理内存大小值不变,而 swap 的实际大小
计算方式为(--memory-swap)-(--memory)=容器可用 swap
参考资料马哥