我正在部署带有耦合服务的堆栈文件(每个服务只有一个副本),并且我需要限制每个容器以使用不同的CPU核心子集。我在网上https://console.developers.google.com/apis/api/dialogflow.googleapis.com/overview?project=发现swarm的堆栈文件(撰写v3)不支持cpuset。我尝试了cpu limit,但这只会指定cpu资源的百分比而不是核心。这种情况下可以解决吗?我需要分配内核来支持软件许可限制。
答案 0 :(得分:1)
是的,您可以限制CPU份额。例如:
with
答案 1 :(得分:1)
不幸的是,正如您已经发现的那样,目前还没有办法将任务限制为运行具有堆栈和/或服务的群集模式的给定核心或一组核心。
一个合理的选择是在过程中绕过Swarm手动启动希望运行它们的机器上的那些容器。因此,将您的机器用作“普通的”泊坞窗守护程序并使用--cpuset-cpus
标志。
唯一的问题是,容器默认情况下可以访问所有cpus ,除非上述单个容器受上述标志限制。因此,您需要小心并从Swarm中排除这些节点,否则它将安排容器并使用您希望限制许可软件使用的内核。
另一种选择是运行确实支持--cpuset-cpus
标志的旧Swarm。因此,您可以在由Swarm模式管理的Docker舰队上运行一个旧的Swarm。只需确保Swarm模式不会访问托管固定和受CPU限制的容器的计算机,例如,可以选择以下选项:
+-------------+
| Swarm Mode |
+----------------+ Primary |
| | |
| +------+------+
| |
| |
| | +----------------+
| | | Containers |
| | | with |
| | | pinned cores |
+------v------+ +------v------+ +------+------+---------+
| | | | | |
| Agent | | Agent | | Agent |
| | | | | |
+------+------+ +------^------+ +------^------+
^ | |
| | |
| | |
| | |
| | |
| | |
| +------+------+ |
| | Swarm | |
+----------------+ Primary +----------------+
| |
+-------------+
总而言之,到目前为止,仅使用Docker Swarm模式还没有合理的解决方法。将来仍有希望看到这片土地。
答案 2 :(得分:0)
另一个选择可能是在容器内使用任务集。您可以在堆栈文件中更改服务容器命令,以便将其包装在任务集中(您可能需要自定义映像)。 例如:taskset -c 2,3启动脚本