DockervscodeDev Container
限制vscode开发容器的资源
喜欢远程开发的同学,一定会喜欢vscode的远程开发容器,但不知道你们遇到过跟我一样的问题没,那就是开发容器随着时间推移容易不知不觉的就占用了主机大量的资源,尤其是内存。还有一种现象就是在开发容器中进行编译等消耗cpu的操作,会导致主机的cpu占用率飙升,这会短期导致其他业务的卡顿。为此我们需要对开发容器的资源进行限制,本文只是给小白一个直接的方法,减少不必要的麻烦。对于有更多限制资源需求的同学,也可以参考本文的方法去展开。
如果不对容器的资源加以限制,很容易影响我们主机本身的稳定性,尤其是主机本身还提供了其他服务的时候。比如,我是一名云开发者,为了充分利用我的云服务器资源,我会在云服务器部署自己的博客、相册之类的服务,同时我也会进行远程开发,这时候我就不希望我的开发容器占用过多的资源。
docker update支持修改容器的资源限制,使用方法如下:
Usage: docker update [OPTIONS] CONTAINER [CONTAINER...]
Update configuration of one or more containers
Options:
--blkio-weight uint16 Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
--cpu-period int Limit CPU CFS (Completely Fair Scheduler) period
--cpu-quota int Limit CPU CFS (Completely Fair Scheduler) quota
--cpu-rt-period int Limit the CPU real-time period in microseconds
--cpu-rt-runtime int Limit the CPU real-time runtime in microseconds
-c, --cpu-shares int CPU shares (relative weight)
--cpus decimal Number of CPUs
--cpuset-cpus string CPUs in which to allow execution (0-3, 0,1)
--cpuset-mems string MEMs in which to allow execution (0-3, 0,1)
--kernel-memory bytes Kernel memory limit
-m, --memory bytes Memory limit
--memory-reservation bytes Memory soft limit
--memory-swap bytes Swap limit equal to memory plus swap: '-1' to enable unlimited swap
--pids-limit int Tune container pids limit (set -1 for unlimited)
--restart string Restart policy to apply when a container exits限制内存最常用的就是-m、--memory-reservation bytes、`--memory-swap bytes:
-m:内存硬限制,即容器的使用绝对不能超过该内存--memory-reservation bytes:软限制,即当达到该内存时就发出警告--memory-swap bytes:交换内存的限制,如果不想限制swap,可以设置为--memory-swap -1,这个交换内存一定是要比-m的值大的,毕竟就是用来当内存不够用的时候使用的。限制cpu比较常用的就是--cpus:
--cpus:限制cpu的数量,比如--cpus 2就是限制容器最多使用2个cpu,如果是--cpus 0.5就是限制容器最多使用0.5个cpu,也就是50%的cpu。在限制之前,我们先看看当前主机的资源使用情况,以下是一些必须查看的步骤。
使用docker stats命令可以查看当前容器对主机资源得使用情况,比如:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
b12bafd427b6 strange_heyrovsky 0.22% 432.6MiB / 7.638GiB 5.53% 5.92MB / 2.54MB 136MB / 102kB 170
546d4ba3fce4 determined_hofstadter 59.40% 578.4MiB / 1.5GiB 37.66% 1.08MB / 1.18MB 236MB / 2.12MB 109如上所示,我们这里有两个开发容器strange_heyrovsky和determined_hofstadter,其中strange_heyrovsky是还没被我限制过的容器,它资源统计信息如下:
CPU %:当前容器使用的cpu百分比,这里为0.22%MEM USAGE / LIMIT:当前容器使用的内存和限制的内存,这里为432.6MiB / 7.638GiB7.638GiB就是我主机的内存,也就是8GBMEM %:当前容器使用的内存百分比,这里为5.53%NET I/O:网络的输入输出,这里为5.92MB / 2.54MBBLOCK I/O:块设备的输入输出,这里为136MB / 102kBPIDS:当前容器的进程数,这里为170可以看出来啊,开发容器的PIDS是很高的,主要因为运行了各种插件,还有就是多次连接开发容器,导致容器内的进程没有被关闭,因此会堆积,从而消耗大量资源。
那么我们主机的资源如何呢?需要了解后以更好的进行限制:
查看内存:执行命令free -m
total used free shared buff/cache available
Mem: 7821 2563 222 67 5035 4883
Swap: 0 0 0free是空闲的内存,-m参数定义了单位为MB,因此这里空闲内存为222MBbuff/cache是缓存的内存,这里为5035MB,该缓存内存是可以被回收的。available是可用的内存,这里为4883MB,这个值是free和buff/cache中可回收的内存的和,因此我们可以把它当做空闲内存来看待,即4883MB就是我们可以使用的内存查看CPU:执行命令lscpu
CPU(s): 22,也就是我们主机有2个CPU。也就是说我们用docker update --cpus 命令限制容器的CPU个数时,最大值为2。查看当前主机资源使用情况,确定限制的值。
8GB内存,2个CPU,因此我策略是默认都只给1.5G内存,1G内存的软限制,2G的swap,1个CPU确定开发容器的名称
如果设置了容器名称,那就直接使用名称。对于vscode的Dev Container插件来说,可能默认是随机名称,这时候可以如下图所示查看容器名称:
获取vscode-容器名称
determined_hofstadter当然,如果没有打开vscode,想直接用命令查看也是可以的:
docker ps -f label=vsch.local.repository.folder=folder_name是你用vscode创建开发容器时的目录名称,如果你跟我一样,喜欢把目录名按照项目名称去创建的话,那么这里的folder_name就是你的项目名称。这样的好处就是方便记忆当然,通过命令的话还有很多label值可以用:
vsch.local.repository:仓库路径vsch.local.repository.volume:docker卷的名称执行限制命令
docker update -m 1.5G --memory-reservation 1G --memory-swap 2G --cpus 1 determined_hofstadter查看限制结果:
docker inspect determined_hofstadtergrep快速查看对应值"Memory""MemoryReservation""MemorySwap""NanoCpus"5星级建议
适时重启开发容器
由于多次连接容易导致开发容器内的进程没有关闭,因此建议是当资源占用较高时,在不使用的时候可以手动的重启或关闭开发容器,这样可以清退容器内的进程,从而释放资源。