Docker集群带来了太多的进程

时间:2018-12-28 16:02:16

标签: docker docker-compose celery docker-swarm

我正在使用docker swarm运行一些celery工人,并且发现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将不会显示芹菜加工过程。一旦缩小到1,我就会在ps中看到(再次)有4个进程。

-编辑(2)-

好的,我不认为celery会自动产生进程以容纳CPU的数量。 -c 1解决了“问题”。

2 个答案:

答案 0 :(得分:2)

此处的一些概念:

服务:由docker service ls给出,在docker-compose.yml中的关键字服务(如“ celery”)下定义,它是docker实例的逻辑组。

进程:在Linux版Docker中,您可以使用ps直接在主机上的容器中看到正在运行的进程。 (如果将bash放入容器并运行ps ax | grep celery,则应该看到几乎相同的内容。)

芹菜通过创造工人来工作。默认数量是CPU核心数。因此,使用celery worker,您将获得4个工作进程。

答案 1 :(得分:1)

在容器内部运行的服务,容器和进程是三件事。

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

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

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

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