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

uWSGI Workers全忙但请求量极低,Flask应用优化遇阻求助

排查uWSGI Workers全忙但QPS极低的问题

兄弟,我太懂你这种明明服务器算力拉满,但uWSGI workers全忙却跑不动QPS的憋屈了——咱一步步揪出问题根源,搞定它!

1. 先查最核心的:Worker是不是被阻塞了(90%的概率是这个)

Flask是同步框架,默认uWSGI的worker也是同步的。如果你的请求里藏着阻塞操作(比如慢得离谱的SQL查询、卡壳的第三方API调用、无意义的sleep、大文件IO),worker会死死卡在那里,根本没法处理新请求,自然全忙但QPS上不去。

  • 怎么验证?
    用uWSGI自带工具看worker状态:

    uwsgi --connect-and-read /path/to/your/uwsgi.sock
    

    或者给uWSGI加个stats服务器,用uwsgitop可视化监控:

    ; 加到你的uWSGI配置文件里
    stats = 127.0.0.1:9191
    

    要是看到大部分worker一直处于busy状态,半天不释放,那实锤是阻塞了。

  • 解决办法:

    • 给uWSGI开异步模式:用gevent或者eventlet让worker能同时处理多个请求,不被阻塞操作卡死。配置参考:
      ; uwsgi.ini 示例配置
      master = true
      processes = 8  ; m5.xlarge是4核,设成核数*2刚好
      threads = 4    ; 每个进程开4个线程,榨干多核资源
      async = 100    ; 每个worker的异步协程数,按需调整
      http-websockets = true  ; 必须开,你用了WebSocket
      wsgi-file = your_flask_app.py
      callable = app
      gevent = 100   ; 启用gevent异步支持
      
    • 干掉阻塞操作本身:优化慢SQL加索引、用Redis缓存重复查询、把第三方API调用丢给Celery异步处理,总之别让请求在worker里卡着。

2. 检查uWSGI配置是否匹配服务器资源

m5.xlarge是4vCPU+8GB内存,配置不合理要么浪费资源,要么导致上下文切换开销爆炸。

  • 合理配置参考:
    • processes:别超过CPU核数的2倍(比如8个),太多进程会让CPU一直在切换上下文,反而变慢。
    • threads:每个进程开2-4个线程,既能利用多核,又比多进程省内存。
    • 异步模式下的async:设100-200就行,太高会增加内存开销。
    • 内存要留余量:每个Flask worker大概占50-200MB,8个进程*4线程的话,8GB内存完全扛得住。

3. WebSocket配置别踩坑

你用了WebSocket,uWSGI和Nginx的配置都得跟上,不然容易出现连接卡住、worker被占着不放的情况。

  • uWSGI必须加的配置:
    http-websockets = true
    wsgi-disable-file-wrapper = true  ; 避免文件包装器导致的阻塞
    buffer-size = 32768  ; 增大缓冲区,防止WebSocket消息截断
    
  • Nginx的WebSocket配置再确认一遍(你说Nginx能扛负载,但以防万一):
    location /ws {
        proxy_pass http://uwsgi_backend;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
    

4. 让Master进程管好Worker

要是Master进程没好好干活,worker可能僵死或者没法回收,导致全忙。

  • 给uWSGI加这些配置,让Master自动管理worker:
    master = true
    max-requests = 10000  ; 每个worker处理10000个请求就重启,避免内存泄漏
    vacuum = true  ; 退出时清理临时文件和socket
    die-on-term = true  ; 收到终止信号时优雅退出,别硬怼
    

5. 扒日志找细节

最后去看uWSGI的错误日志和访问日志,说不定能抓到超时、连接重置的线索:

tail -f /var/log/uwsgi/your_app.log

要是看到timeout、connection reset by peer或者数据库连接超时的日志,直接对着那个点优化就行。


总结一下:先确认worker是不是被阻塞了(用uwsgitop一目了然),然后调整uWSGI的进程/线程/异步配置,确保WebSocket配置正确,最后扒日志找具体问题。你的服务器算力够,大概率是阻塞操作或者没开异步导致的,按上面的步骤来应该能搞定!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 09:05:08