限制vscode开发容器的资源

2024-08-23 20:03:27 浏览数 (2)

DockervscodeDev Container

限制vscode开发容器的资源

喜欢远程开发的同学,一定会喜欢vscode的远程开发容器,但不知道你们遇到过跟我一样的问题没,那就是开发容器随着时间推移容易不知不觉的就占用了主机大量的资源,尤其是内存。还有一种现象就是在开发容器中进行编译等消耗cpu的操作,会导致主机的cpu占用率飙升,这会短期导致其他业务的卡顿。为此我们需要对开发容器的资源进行限制,本文只是给小白一个直接的方法,减少不必要的麻烦。对于有更多限制资源需求的同学,也可以参考本文的方法去展开。

如果不对容器的资源加以限制,很容易影响我们主机本身的稳定性,尤其是主机本身还提供了其他服务的时候。比如,我是一名云开发者,为了充分利用我的云服务器资源,我会在云服务器部署自己的博客、相册之类的服务,同时我也会进行远程开发,这时候我就不希望我的开发容器占用过多的资源。

限制方法

docker update支持修改容器的资源限制,使用方法如下:

代码语言:javascript复制
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命令可以查看当前容器对主机资源得使用情况,比如:

代码语言:javascript复制
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_heyrovskydetermined_hofstadter,其中strange_heyrovsky是还没被我限制过的容器,它资源统计信息如下:

  • CPU %:当前容器使用的cpu百分比,这里为0.22%
  • MEM USAGE / LIMIT:当前容器使用的内存和限制的内存,这里为432.6MiB / 7.638GiB
    • 这里的7.638GiB就是我主机的内存,也就是8GB
  • MEM %:当前容器使用的内存百分比,这里为5.53%
  • NET I/O:网络的输入输出,这里为5.92MB / 2.54MB
  • BLOCK I/O:块设备的输入输出,这里为136MB / 102kB
  • PIDS:当前容器的进程数,这里为170

可以看出来啊,开发容器的PIDS是很高的,主要因为运行了各种插件,还有就是多次连接开发容器,导致容器内的进程没有被关闭,因此会堆积,从而消耗大量资源。

那么我们主机的资源如何呢?需要了解后以更好的进行限制:

查看内存:执行命令free -m

代码语言:javascript复制
              total        used        free      shared  buff/cache   available
Mem:           7821        2563         222          67        5035        4883
Swap:             0           0           0
  • free是空闲的内存,-m参数定义了单位为MB,因此这里空闲内存为222MB
  • buff/cache是缓存的内存,这里为5035MB,该缓存内存是可以被回收的。
  • available是可用的内存,这里为4883MB,这个值是freebuff/cache中可回收的内存的和,因此我们可以把它当做空闲内存来看待,即4883MB就是我们可以使用的内存

查看CPU:执行命令lscpu

代码语言:javascript复制
CPU(s):                2
  • 上面对结果进行了裁剪,只保留了我们关心的CPU个数,这里为2,也就是我们主机有2个CPU。也就是说我们用docker update --cpus 命令限制容器的CPU个数时,最大值为2

限制资源步骤¶

查看当前主机资源使用情况,确定限制的值。

  • 比如我这里的主机有8GB内存,2个CPU,因此我策略是默认都只给1.5G内存,1G内存的软限制,2G的swap,1个CPU

确定开发容器的名称

如果设置了容器名称,那就直接使用名称。对于vscode的Dev Container插件来说,可能默认是随机名称,这时候可以如下图所示查看容器名称:

获取vscode-容器名称

  • 如上所示,圈出的容器名称为determined_hofstadter

当然,如果没有打开vscode,想直接用命令查看也是可以的:

代码语言:javascript复制
docker ps -f label=vsch.local.repository.folder=
  • folder_name是你用vscode创建开发容器时的目录名称,如果你跟我一样,喜欢把目录名按照项目名称去创建的话,那么这里的folder_name就是你的项目名称。这样的好处就是方便记忆

当然,通过命令的话还有很多label值可以用:

  • vsch.local.repository:仓库路径
  • vsch.local.repository.volume:docker卷的名称

执行限制命令

代码语言:javascript复制
docker update -m 1.5G --memory-reservation 1G --memory-swap 2G --cpus 1 determined_hofstadter

查看限制结果:

代码语言:javascript复制
docker inspect determined_hofstadter
  • 上面设置分别对应以下字段,可以利用grep快速查看对应值
    • "Memory"
    • "MemoryReservation"
    • "MemorySwap"
    • "NanoCpus"

vscode开发容的使用建议¶

5星级建议

适时重启开发容器

由于多次连接容易导致开发容器内的进程没有关闭,因此建议是当资源占用较高时,在不使用的时候可以手动的重启或关闭开发容器,这样可以清退容器内的进程,从而释放资源。

0 人点赞