docker 限制已运行容器的 Cpu 和内存

1. 问题描述

最近云服务器的内存经常不够用,而且是莫名其妙的增多,在腾讯云的控制台里面看,4gb 的内存占用了 3.2 gb,就卡到连 ssh 都连不上了

PS: 已换过网络和设备,确认不是用户端网络问题导致无法 ssh

img

实在没辙了,只能把我的几个不热门的 kook-bot 移植到 replit 白嫖,再限制一下 lsky 图床 docker 镜像的内存用量

其实主要是 nsfw-api 的内存用量,我发现有人故意给我的图床上传 h 图。lsky 后台由于鉴黄不通过,不允许上传,也看不到是谁干的。隔这压力测试呢?

我的图床基本只对自己的博客使用。开放游客上传,也只是方便大家临时上传一些图片,还请大家手下留情!!!😥

这个操作我做了几次,也算是一个高频操作了。在此记录一下如何更改一个正在运行中容器的内存限制

2. 修改内存限制

先使用 ps 命令查看当前容器和对应的 id

plaintext
1
docker ps

可以看到,lsky 图床和 nsfw 的镜像分别是第二个和第三个

image-20230306184202020

再用 stats 命令查看当前的状态

plaintext
1
docker stats

image-20230306184518474

可以看到,图床的内存没有进行限制,nsfw 的内存已经被限制到了 618mb,当前已用 565mb,基本要满了.

重启一下容器,发现初始化的时候只需要 100mb 左右的内存,合计着现在就有人在往图床里面上传图片?🤣🤣🤣

image-20230306184437446

这怎么行,直接给它内存限制干到 512mb,能省一点内存是一点,不能因为图床导致我服务器卡死。

修改限制,要使用的是 container update 命令

参考文档

名称,简写默认值描述
–blkio-weight0 阻塞 IO (相对权重),介于 101000 之间,或 0 禁用 (默认为 0)
–cpu-period0 限制 CPU CFS (完全公平的调度程序) 周期
–cpu-quota0 限制 CPU CFS (完全公平的调度程序) 配额
–cpu-rt-period0 限制 CPU 实时周期 (以微秒为单位)
–cpu-rt-runtime0 以微秒为单位限制 CPU 实时运行时间
–cpu-shares, -c0CPU 份额 (相对权重)
–cpuset-cpus 允许执行的 CPU (0-3,0)
–cpuset-mems 允许执行的内存率 (0-3,0.1)
–kernel-memory 内核内存限制
–memory, -m 内存限制
–memory-reservation 内存软限制
–memory-swap 交换限制等于内存加交换:-1 以启用无限制的交换
–restart 重新启动在容器退出时应用的策略
模板如下
plaintext
1
docker container update 容器名 --memory="2g"  --memory-swap="-1"

上面的命令会限制容器的内存为 2gb,交换内存设置为 -1(以启用无限制的交换)

比如我现在想修改 nsfw 容器的内存限制,应该如下操作

plaintext
1
docker container update nsfw-api --memory="0.5g" 

然后发现报错了

plaintext
1
Error response from daemon: Cannot update container 418fc2a79fa7ad2e637babe17424ee60e9027ef4a7fada3f279864e76bdaaa10: Memory limit should be smaller than already set memoryswap limit, update the memoryswap at the same time

大概意思是让我们同时更新交换内存

bash
1
docker container update nsfw-api --memory="0.5g"  --memory-swap="-1"

现在就 ok 了,执行成功会在命令的下一行显示镜像的名字

plaintext
1
2
# docker container update nsfw-api --memory="0.5g"  --memory-swap="-1"
nsfw-api

stats 看一下,发现已经修改成功了

plaintext
1
docker stats

image-20230306185809744

修改其他容器的效果也是一样的,目的已经达到啦!

3. 修改 cpu 限制

下面的命令意思是限制容器只能使用主机上两个 cpu

plaintext
1
docker container update  容器名 --cpus=2

所谓两个 CPU,其实就是主机上 CPU 的两个线程。比如如果你的云服务器是 2 核心 4 线程的,那么这个限制就代表该容器只能使用 2 个线程。

https://www.cnblogs.com/sparkdev/p/8052522.html

https://zhuanlan.zhihu.com/p/388012843