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类型:如果用的是默认的
syncworker,遇到IO阻塞(比如数据库查询、外部API调用)时会直接卡住,无法处理新请求。建议换成gevent异步worker(先安装gunicorn[gevent]),它能在IO等待时切换处理其他请求,大幅提升IO密集型应用的并发能力。 - 定位Django内部阻塞:用
django-debug-toolbar在测试环境分析每个请求的耗时分布,生产环境可以用py-spy对Gunicorn进程进行采样,无需重启应用就能找出长时间阻塞的函数。
三、数据库及外部依赖瓶颈
- 检查数据库连接数:查看Django
settings.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
相关产品推荐
相关产品推荐

