Docker swarm 带来了太多进程

Docker swarm bringing up too many processes

我正在 运行使用 docker swarm 与一些 celery worker 进行连接,并注意到 docker service ls 显示的进程明显少于系统工具(如 top)

这是我在 运行 docker service ls

时得到的
docker service ls
ID                  NAME                             MODE                REPLICAS            IMAGE                                                            PORTS
(...)
mdisx2effvfp        stack_celery                     replicated          1/1                 some:url
(...)

这是我在 运行 ps

时得到的
ps ax | grep celery
 7606 ?        Ss     0:49 /usr/local/bin/python /usr/local/bin/celery -A my_package_name worker --loglevel=WARNING -Q my_queue_name
 7733 ?        S     11:53 /usr/local/bin/python /usr/local/bin/celery -A my_package_name worker --loglevel=WARNING -Q my_queue_name
 7734 ?        Sl     6:02 /usr/local/bin/python /usr/local/bin/celery -A my_package_name worker --loglevel=WARNING -Q my_queue_name
 7735 ?        S      5:52 /usr/local/bin/python /usr/local/bin/celery -A my_package_name worker --loglevel=WARNING -Q my_queue_name

这就是我的 docker-compose.yaml

cat docker-compose.yaml
(...)
celery:
  image: some:url
  command: celery -A my_package_name worker --loglevel=WARNING -Q my_queue_name
  depends_on:
    - queue # this is my other container with rabbitmq
  deploy:
    restart_policy:
      condition: any
    replicas: 1
    resources:
      limits:
        memory: 1G
  configs:
    - source: celeryconfig.py
      target: /my_package_name/celeryconfig.py
  networks:
    - backend

我是不是漏掉了什么?

我猜(当然基于我的配置)docker service ls 应该显示与普通系统工具相同数量的进程...

请帮我理解。

--编辑(1)--

我还可以确认,当缩放到零时,我根本没有得到任何进程:

docker service scale stack_celery=0

当我这样做时,ps 将不会显示 celery 进程。一旦我缩小到 1,我就可以在 ps 中看到(再次)有 4 个进程。

--编辑(2)--

好的,我不认为 celery 会自动生成进程来容纳 CPU 的数量。 -c 1 修复了 "problem".

服务、容器和进程运行容器内部是三种不同的东西。

服务用于部署一个或多个具有相同配置的容器并维护目标状态。 service ls 显示容器 运行 的副本数,而不是每个容器内有多少进程 运行ning。

容器是 运行 应用程序的隔离环境。该环境为文件系统、网络和进程 ID 等内容获取命名空间。注意主机可以看到所有命名空间中的进程,但是在容器命名空间内部,你只能看到属于同一个命名空间的进程。

您在容器内的应用程序可能会产生多个进程。当容器内的 pid 1 退出时,容器将停止,所以不要在后台启动服务器并退出启动它的 shell。使用芹菜,它 运行 多个工人。一个容器只有一个副本,但是那个容器里面会有多个pid。

另请参阅:http://docs.celeryproject.org/en/latest/userguide/workers.html

这里有几个概念:

service:由docker service ls给出,定义在你的docker-compose.yml关键字services下,如"celery",是[=26]的逻辑组=] 实例。

进程:在 Docker for linux 中,您可以使用 ps 在您的主机上直接在您的容器中看到进程 运行ning。 (如果你 bash 进入你的容器和 运行 ps ax | grep celery,你应该看到几乎相同的东西。)

Celery 通过创建工人来工作。默认数量是 CPU 个核心数。因此,使用 celery worker 你会得到 4 个工作进程。