【问题标题】:Docker containerd-shim cost too much memoryDocker containerd-shim 消耗太多内存
【发布时间】:2020-02-06 09:42:38
【问题描述】:

我想在我的一台 linux 电脑上部署 100 个容器。

如果不使用 docker,那 100 个服务的内存是可以的。

但如果使用 docker,我会看到下一个:

 25504  0.0  0.0  10796  5060 ?        Sl   12:41   0:00 containerd-shim -namespace moby -workdir /var/lib/containerd/io.containerd.runtime.v1.linux/moby/779ab7bff4bed93d2912437e58e9b830c2f72ef2d8f3b4a5ba31e6d0db8e72b2 -address /run/containerd/containerd.sock -containerd-binary /usr/bin/containerd -runtime-root /var/run/docker/runtime-runc

这意味着对于一个容器,containerd-shim 将花费5M 内存,更糟糕的是:对于每个新容器,都会有一个containerd-shim 进程。这意味着对于 100 个容器,将有额外的 5M * 100 = 500M 内存消耗。

超出预期吗?我有机会尝试减少500M吗?

【问题讨论】:

  • 您是否已经尝试限制容器资源? docs.docker.com/v17.09/engine/admin/resource_constraints/…
  • @LinPy 我不是说 docker 容器本身使用的资源,我是说下一个:dockerd -> containerd -> containerd-shim (runc) -> PID1。如你所知,dockerd & containerd 只有一个实例,但containerd-shim 将控制runc 启动container,每个容器都会有一个containerd-shim,这可以使容器在dockerd 崩溃时也能存活。作为PID1的父进程,占用内存太大。我曾经听说,我们可以不使用containerd-shim,只需使用containerd 启动runc,但不确定,所以这里有这个问题。
  • @LinPy 很遗憾medium.com在我的网络环境中被屏蔽了,能否请您把它作为答案,让我学习一下?

标签: docker


【解决方案1】:

使用runc的步骤

-从Docker image中提取json

mkdir my_container
cd my_container
mkdir rootfs
docker export $(docker create busybox) | tar -C rootfs -xvf -
docker-runc spec

-启动容器

runc run container-name

Source

PS:您也可以尝试将运行时间添加到Docker daemon

docker daemon --add-runtime "oci=/usr/local/sbin/runc"

【讨论】:

  • 我赞成这个,因为它可以运行,但似乎没有解决方案,因为即使这也不能满足我的要求。因为,我发现runc 的行为不像我预期的那样,我想one containerd 处理所有containers,但实际上它是multiple runc 处理multiple containers。我现在没有很多containerd-shim,但仍然有很多runc 用于多个容器。更糟糕的是,containerd-shim 消耗 5Mrunc 消耗 17M。而containerd-shime 是一个允许runc 离开的进程,所以我猜containerd-shime 做了更多的优化以允许无守护进程。无论如何,谢谢。
猜你喜欢
  • 2018-03-20
  • 2020-03-19
  • 2020-04-16
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
相关资源
最近更新 更多