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

Django/Gunicorn/Nginx应用低资源占用下的请求瓶颈排查求助

这种情况我之前排查过类似的,CPU内存都低但请求量上不去还报错,大概率不是计算资源瓶颈,得从网络、连接数、服务配置或者数据库这些方向入手,给你分步骤的排查思路和工具推荐:

一、先排查Nginx层面的瓶颈
  • 检查Nginx连接数限制:打开nginx.conf查看worker_connections(单个worker允许的最大连接数)、worker_processes(worker进程数,建议和CPU核心数一致),还有keepalive_timeout、keepalive_requests参数。用ss -s统计当前TCP连接状态,看看是否有大量TIME_WAIT或SYN_RECV连接——这类连接会占用端口资源,导致新请求无法建立。
  • 查看Nginx错误日志:执行tail -f /var/log/nginx/error.log,重点关注no live upstreams、connection refused或超时相关的错误,这可能是Nginx和Gunicorn之间的连接链路出了问题。
  • 验证静态资源处理逻辑:如果请求中包含大量静态文件,确认Nginx是否直接处理了这些请求,而非转发给Gunicorn。静态资源处理效率低也会拖垮整体请求承载能力。
二、排查Gunicorn与Django之间的问题
  • 检查Gunicorn连接配置:除了工作进程数,还要关注--worker-connections(每个worker可处理的并发连接数,默认1000,但同步workersync不生效,因为它一次只能处理一个请求)、--timeout、--graceful-timeout参数。查看Gunicorn日志tail -f /var/log/gunicorn/your_app.log,看是否有请求因超时被强制终止的记录。
  • 确认worker类型:如果用的是默认的sync worker,遇到IO阻塞(比如数据库查询、外部API调用)时会直接卡住,无法处理新请求。建议换成gevent异步worker(先安装gunicorn[gevent]),它能在IO等待时切换处理其他请求,大幅提升IO密集型应用的并发能力。
  • 定位Django内部阻塞:用django-debug-toolbar在测试环境分析每个请求的耗时分布,生产环境可以用py-spy对Gunicorn进程进行采样,无需重启应用就能找出长时间阻塞的函数。
三、数据库及外部依赖瓶颈
  • 检查数据库连接数:查看Djangosettings.py中DATABASES配置的CONN_MAX_AGE和MAX_CONNS,如果Gunicorn进程数过多,可能会把数据库连接池占满,新请求只能等待连接释放。用psql -c "SELECT count(*) FROM pg_stat_activity;"(PostgreSQL)或show processlist;(MySQL)查看当前连接数,确认是否达到数据库max_connections限制。
  • 排查慢查询:开启数据库慢查询日志,比如PostgreSQL设置log_min_duration_statement = 100(记录超过100ms的查询),MySQL开启slow_query_log = 1,找出拖慢请求的频繁慢查询。
  • 验证外部API可用性:如果Django视图中有调用外部服务的逻辑,检查这些服务的响应时间和限流规则——外部服务超时或限流会直接导致Django请求阻塞。
四、系统层面的隐藏瓶颈
  • 端口资源限制:查看Linux系统临时端口范围sysctl net.ipv4.ip_local_port_range和TIME_WAIT回收参数sysctl net.ipv4.tcp_tw_reuse、sysctl net.ipv4.tcp_tw_recycle。如果大量TIME_WAIT连接占满端口,新请求无法建立连接,可以临时调整参数:
    sysctl -w net.ipv4.tcp_tw_reuse=1
    sysctl -w net.ipv4.tcp_fin_timeout=30
    
  • 文件描述符限制:Nginx和Gunicorn需要大量文件描述符处理连接,用ulimit -n查看当前限制,若过低可修改/etc/security/limits.conf提高上限:
    * soft nofile 65535
    * hard nofile 65535
    
  • 网络带宽瓶颈:用iftop或nload实时监控服务器网络流量,确认是否达到带宽上限——带宽占满会导致请求超时或失败。
五、监控工具推荐
  • 系统层面:htop(比top更直观的进程监控)、vmstat(查看系统整体资源状态)、iostat(磁盘IO监控)、ss(TCP连接状态统计)、iftop(实时网络流量监控)。
  • 应用层面:
    • prometheus + grafana:可统一监控Nginx、Gunicorn、Django、数据库的各项指标(请求数、响应时间、错误率、连接数等),通过可视化面板快速定位瓶颈。
    • py-spy:Python进程采样工具,无需重启应用即可分析Gunicorn worker的函数调用耗时,精准找出阻塞点。
    • django-prometheus:集成到Django中,暴露metrics给Prometheus,监控请求耗时、数据库查询次数等应用内部指标。
    • nginx-exporter:专门监控Nginx的请求状态、连接数、响应码等数据。
  • 日志分析:lnav(轻量日志查看与分析工具)、ELK Stack(Elasticsearch+Logstash+Kibana),集中分析Nginx、Gunicorn、Django的日志,找出错误规律。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:17:43