【Docker】限制已运行容器的Cpu和内存
docker限制已运行容器的Cpu和内存
1.问题描述
最近云服务器的内存经常不够用,而且是莫名其妙的增多,在腾讯云的控制台里面看,4gb 的内存占用了3.2 gb,就卡到连 ssh 都连不上了
PS: 已换过网络和设备,确认不是用户端网络问题导致无法ssh
实在没辙了,只能把我的几个不热门的kook-bot移植到replit白嫖,再限制一下lsky图床docker镜像的内存用量
其实主要是
nsfw-api
的内存用量,我发现有人故意给我的图床上传h图。lsky后台由于鉴黄不通过,不允许上传,也看不到是谁干的。隔这压力测试呢?我的图床基本只对自己的博客使用。开放游客上传,也只是方便大家临时上传一些图片,还请大家手下留情!!!😥
这个操作我做了几次,也算是一个高频操作了。在此记录一下如何更改一个正在运行中容器的内存限制
2.修改内存限制
先使用ps命令查看当前容器和对应的id
1 | docker ps |
可以看到,lsky图床和nsfw的镜像分别是第二个和第三个
再用stats命令查看当前的状态
1 | docker stats |
可以看到,图床的内存没有进行限制,nsfw 的内存已经被限制到了618mb,当前已用565mb,基本要满了.
重启一下容器,发现初始化的时候只需要100mb左右的内存,合计着现在就有人在往图床里面上传图片?🤣🤣🤣
这怎么行,直接给它内存限制干到512mb,能省一点内存是一点,不能因为图床导致我服务器卡死。
修改限制,要使用的是container update
命令
名称,简写 默认值 描述 –blkio-weight 0 阻塞IO(相对权重),介于 10
和1000
之间,或0
禁用(默认为0
)–cpu-period 0 限制CPU CFS(完全公平的调度程序)周期 –cpu-quota 0 限制CPU CFS(完全公平的调度程序)配额 –cpu-rt-period 0 限制CPU实时周期(以微秒为单位) –cpu-rt-runtime 0 以微秒为单位限制CPU实时运行时间 –cpu-shares, -c 0 CPU份额(相对权重) –cpuset-cpus 允许执行的CPU(0-3,0) –cpuset-mems 允许执行的内存率(0-3,0.1) –kernel-memory 内核内存限制 –memory, -m 内存限制 –memory-reservation 内存软限制 –memory-swap 交换限制等于内存加交换: -1
以启用无限制的交换–restart 重新启动在容器退出时应用的策略 模板如下
1 | docker container update 容器名 --memory="2g" --memory-swap="-1" |
上面的命令会限制容器的内存为2gb,交换内存设置为-1
(以启用无限制的交换)
比如我现在想修改nsfw容器的内存限制,应该如下操作
1 | docker container update nsfw-api --memory="0.5g" |
然后发现报错了
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 |
大概意思是让我们同时更新交换内存
1 | docker container update nsfw-api --memory="0.5g" --memory-swap="-1" |
现在就 ok 了,执行成功会在命令的下一行显示镜像的名字
1 | # docker container update nsfw-api --memory="0.5g" --memory-swap="-1" |
在stats
看一下,发现已经修改成功了
1 | docker stats |
修改其他容器的效果也是一样的,目的已经达到啦!
3.修改cpu限制
下面的命令意思是限制容器只能使用主机上两个cpu
1 | docker container update 容器名 --cpus=2 |
所谓两个 CPU,其实就是主机上 CPU 的两个线程。比如如果你的云服务器是 2 核心 4 线程的,那么这个限制就代表该容器只能使用 2 个线程。