空闲时,Celery docker 容器的 CPU 使用率非常高,
docker stats
显示高达 600% 使用率。在启动容器后,在任何任务或请求发送到 Celery 之前,会立即观察到此行为。
这是我在 celery docker 文件中的运行命令
CMD celery -A make_celery worker --pool=gevent --loglevel INFO
此部署位于具有 2vCPU 的 Google Cloud VM 上,实例 CPU 使用率在 80% 到 90% 之间波动
我也尝试过预叉工人,但行为是一样的。 还尝试强制 celery 工作线程计数为 1,并且在没有其他服务的情况下独立运行容器。
通过在 celery 实例上启用 DEBUG 日志记录,找到了 CPU 使用率高的原因。
CMD celery -A make_celery worker --loglevel DEBUG
有异常数量的 ping 调用,导致检查 docker compose 中配置的运行状况检查。
[DEBUG/MainProcess] pidbox received method ping() [reply_to:{'exchange': 'reply.celery.pidbox', 'routing_key': '********'} ticket:********]
在我的 docker compose 中我有
celery_worker:
build:
context: .
dockerfile: ./docker/prod/celery.Dockerfile
image: [repo/image]
healthcheck:
test: celery -A make_celery inspect ping
interval: 1s <-------------
timeout: 5s
retries: 10
env_file:
- .env
depends_on:
- redis
networks:
- app-network
restart: unless-stopped
由于 celery 健康检查的工作原理,它会创建新的工作线程来运行 ping 命令。然而,由于 1 秒的间隔,它会立即连续创建一个新的工作线程。
将其更改为不太频繁的间隔会立即减少 CPU 负载。
celery_worker:
build:
context: .
dockerfile: ./docker/prod/celery.Dockerfile
image: [repo/image]
healthcheck:
test: celery -A make_celery inspect ping
interval: 60s
timeout: 5s
retries: 5
env_file:
- .env
depends_on:
- redis
networks:
- app-network
restart: unless-stopped