我正在使用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
解决了“问题”。
答案 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