与 Nginx、Flask 和 Redis 一起部署时,Celery docker 容器上的空闲高 CPU 使用率

问题描述 投票:0回答:1

空闲时,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,并且在没有其他服务的情况下独立运行容器。

flask celery
1个回答
0
投票

通过在 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
© www.soinside.com 2019 - 2024. All rights reserved.