我可以将核心分配给 docker 集群容器吗?
can i assign cores to docker swarm containers?
我正在部署一个包含几个服务的堆栈文件(每个服务只有 1 个副本),我需要限制每个容器使用 CPU 个核心的不同子集。我在网上 here 发现 swarm 的堆栈文件(compose v3)不支持 cpuset。我尝试了 cpu 限制,但这只会指定 cpu 资源的百分比,而不是核心。这种情况有解决办法吗?我需要内核分配来支持软件许可限制。
是的,您可以限制 cpu 股。例如:
docker service create --limit-cpu 2 nginx
不幸的是,正如您已经发现的那样,(目前)还没有办法将任务限制在给定的核心或核心组 运行具有堆栈 and/or 服务的集群模式。
一个合理的选择是在您希望它们 运行 进入的机器上手动启动这些容器,在此过程中绕过 Swarm。因此,将您的机器用作 "plain-old" docker 守护进程并使用 --cpuset-cpus
标志。
唯一的问题是 容器,默认情况下,可以访问所有 cpus,除非它被上面提到的单个容器的标志限制。因此,您需要小心并从您的 Swarm 中排除这些节点,否则它将调度容器并使用您希望限制用于许可软件的内核。
另一种选择是 运行 支持 --cpuset-cpus
标志的旧 Swarm。因此,您可以 运行 在使用 Swarm 模式管理的 docker 舰队之上安装旧 Swarm。只需确保托管您的固定容器和 cpu-restricted 容器的机器不被 Swarm 模式访问,以下可能是一个选项,例如:
+-------------+
| Swarm Mode |
+----------------+ Primary |
| | |
| +------+------+
| |
| |
| | +----------------+
| | | Containers |
| | | with |
| | | pinned cores |
+------v------+ +------v------+ +------+------+---------+
| | | | | |
| Agent | | Agent | | Agent |
| | | | | |
+------+------+ +------^------+ +------^------+
^ | |
| | |
| | |
| | |
| | |
| | |
| +------+------+ |
| | Swarm | |
+----------------+ Primary +----------------+
| |
+-------------+
总而言之,目前还没有合理的解决方法,仅使用 Docker Swarm 模式。说不定以后还是有希望看到这片土地的。
另一种选择是在您的容器中使用任务集。您可以在堆栈文件中更改您的服务容器命令,以便将其包装在任务集中(您可能需要自定义图像)。
例如:taskset -c 2,3 启动脚本
我正在部署一个包含几个服务的堆栈文件(每个服务只有 1 个副本),我需要限制每个容器使用 CPU 个核心的不同子集。我在网上 here 发现 swarm 的堆栈文件(compose v3)不支持 cpuset。我尝试了 cpu 限制,但这只会指定 cpu 资源的百分比,而不是核心。这种情况有解决办法吗?我需要内核分配来支持软件许可限制。
是的,您可以限制 cpu 股。例如:
docker service create --limit-cpu 2 nginx
不幸的是,正如您已经发现的那样,(目前)还没有办法将任务限制在给定的核心或核心组 运行具有堆栈 and/or 服务的集群模式。
一个合理的选择是在您希望它们 运行 进入的机器上手动启动这些容器,在此过程中绕过 Swarm。因此,将您的机器用作 "plain-old" docker 守护进程并使用 --cpuset-cpus
标志。
唯一的问题是 容器,默认情况下,可以访问所有 cpus,除非它被上面提到的单个容器的标志限制。因此,您需要小心并从您的 Swarm 中排除这些节点,否则它将调度容器并使用您希望限制用于许可软件的内核。
另一种选择是 运行 支持 --cpuset-cpus
标志的旧 Swarm。因此,您可以 运行 在使用 Swarm 模式管理的 docker 舰队之上安装旧 Swarm。只需确保托管您的固定容器和 cpu-restricted 容器的机器不被 Swarm 模式访问,以下可能是一个选项,例如:
+-------------+
| Swarm Mode |
+----------------+ Primary |
| | |
| +------+------+
| |
| |
| | +----------------+
| | | Containers |
| | | with |
| | | pinned cores |
+------v------+ +------v------+ +------+------+---------+
| | | | | |
| Agent | | Agent | | Agent |
| | | | | |
+------+------+ +------^------+ +------^------+
^ | |
| | |
| | |
| | |
| | |
| | |
| +------+------+ |
| | Swarm | |
+----------------+ Primary +----------------+
| |
+-------------+
总而言之,目前还没有合理的解决方法,仅使用 Docker Swarm 模式。说不定以后还是有希望看到这片土地的。
另一种选择是在您的容器中使用任务集。您可以在堆栈文件中更改您的服务容器命令,以便将其包装在任务集中(您可能需要自定义图像)。 例如:taskset -c 2,3 启动脚本