You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行中的gunicorn进程修改worker与线程数(AWS ECS场景)

问题:无需重启容器调整ECS中Gunicorn的Worker/线程数以测试性能

我需要测试部署在AWS ECS服务中的Web服务在不同Gunicorn Worker数量下的性能。当前容器的入口脚本如下:

WORKERS=15
THREADS=15

gunicorn \
  --reload \
  --workers "${WORKERS}" \
  --threads "${THREADS}" \
  --max-requests 10000 \
  --max-requests-jitter 200 \
  --timeout 60 \
  --access-logfile - \
  --error-logfile - \
  --bind 0.0.0.0:8000 \
  config.wsgi:application

现有问题

要修改Worker/线程数,我必须执行:停止Gunicorn → 更新ECS任务定义(设置新的WORKERS和THREADS值)→ 重启ECS容器。测试数十种配置时耗时过长。

临时方案(希望规避)

可以设置类似watch -n 1000 "ls -l"的模拟常驻入口脚本,再通过bash登录ECS容器手动运行指定参数的Gunicorn,但此方法操作不便且需搭建测试专属环境。

核心疑问

是否可以修改已运行的Gunicorn实例的Worker与线程数?无需重启容器或停止入口进程即可测试不同配置。


解答

Worker数量:支持动态调整

Gunicorn自带信号机制,可在不重启主进程的前提下调整Worker数量:

  • 增加Worker:向Gunicorn主进程发送TTIN信号,每次发送新增1个Worker
  • 减少Worker:向Gunicorn主进程发送TTOU信号,每次发送终止1个Worker
  • 批量调整到目标数量:可通过脚本自动循环发送信号,示例如下:
    # 将Worker数调整为20的示例脚本
    TARGET_WORKERS=20
    # 获取Gunicorn主进程PID
    GUNICORN_MASTER_PID=$(pgrep gunicorn)
    # 获取当前Worker数量
    CURRENT_WORKERS=$(ps --ppid $GUNICORN_MASTER_PID | wc -l)
    
    # 增加Worker到目标数
    while [ $CURRENT_WORKERS -lt $TARGET_WORKERS ]; do
        kill -TTIN $GUNICORN_MASTER_PID
        CURRENT_WORKERS=$((CURRENT_WORKERS+1))
    done
    
    # 减少Worker到目标数
    while [ $CURRENT_WORKERS -gt $TARGET_WORKERS ]; do
        kill -TTOU $GUNICORN_MASTER_PID
        CURRENT_WORKERS=$((CURRENT_WORKERS-1))
    done
    

线程数:无法动态调整

Gunicorn的--threads参数是进程启动时的固定配置,一旦主进程启动,无法通过信号或其他方式修改线程数,必须重启Gunicorn进程才能生效。

ECS环境下的优化测试方案

  1. 入口脚本适配环境变量
    修改入口脚本,通过环境变量读取WORKERS和THREADS值,默认值保留原有配置:

    WORKERS=${WORKERS:-15}
    THREADS=${THREADS:-15}
    
    gunicorn \
      --reload \
      --workers "${WORKERS}" \
      --threads "${THREADS}" \
      --max-requests 10000 \
      --max-requests-jitter 200 \
      --timeout 60 \
      --access-logfile - \
      --error-logfile - \
      --bind 0.0.0.0:8000 \
      config.wsgi:application
    

    测试Worker数时,直接进入容器执行信号调整脚本即可;测试线程数时,仅需更新ECS任务定义的环境变量THREADS并重启容器,无需修改脚本或重建镜像。

  2. 用ECS任务集批量测试
    创建多个任务集,每个任务集对应一组WORKERS/THREADS配置,通过调整各任务集的运行实例数,快速切换测试配置,避免逐个容器重启的繁琐操作。


内容的提问来源于stack exchange,提问作者rzlvmp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 12:10:18