Docker Compose中Django+Gunicorn(WSGI容器)资源占用过高求助
排查Django+Gunicorn(WSGI)容器资源占用过高的方向与解决方案
1. 调整Gunicorn Worker与线程配置
当前Gunicorn启动命令为gunicorn server.wsgi --bind 0.0.0.0:8000 --workers 4 --threads 4,Worker数量可能超出服务器承载能力:
- 先用
nproc查看Droplet的CPU核心数,Gunicorn官方推荐Worker数量为2 * CPU核心数 + 1,如果是1核服务器,4个Worker会引发频繁上下文切换,徒增CPU与内存消耗 - 建议先降低Worker数测试:1核服务器改为
--workers 2 --threads 2,2核服务器改为--workers 3 --threads 2,观察资源占用变化 - CPU密集型业务减少线程数,IO密集型业务可适当增加线程,但需同步关注内存占用情况
2. 排查Django应用内部性能问题
- 启用性能调试工具:安装
django-debug-toolbar,查看每个请求的数据库查询次数、视图函数耗时,排查是否存在N+1查询、未优化的ORM操作或耗时逻辑 - 检测内存泄漏:用
memory_profiler对核心视图函数做内存分析,或在容器内执行top -p <gunicorn-worker-pid>,观察单个Worker进程的内存是否随请求持续上涨,若存在则需定位泄漏点(如全局变量未释放、第三方库内存泄漏) - 确认静态文件代理:检查Nginx配置是否正确拦截
/static/、/media/这类静态资源请求,避免Django处理静态文件消耗额外资源(当前docker-compose已挂载静态卷,需确保Nginx配置文件中正确映射这些路径)
3. 容器层面优化与排查
- 添加资源限制:在
docker-compose.yml的backend服务中添加资源限制,防止容器占用过多主机资源:backend: # 原有配置... deploy: resources: limits: cpus: '0.5' # 根据服务器核心数调整 memory: 512M # 根据服务器内存调整 - 检查容器日志:执行
docker logs <backend-container-name>,查看是否存在数据库连接异常、频繁重连、请求报错等日志,这类情况可能导致资源异常消耗
4. 流量与请求分配排查
- 分析访问日志:查看Nginx的访问日志,排查是否存在爬虫、恶意请求或大文件请求,这类请求可能导致WSGI容器持续高负载
- 确认请求路由规则:检查Nginx配置中是否将请求合理分配到WSGI和ASGI容器,若所有请求都转发到WSGI容器(如ASGI仅处理WebSocket但无相关流量),会导致WSGI单独承担全部负载,需调整路由规则分流
内容的提问来源于stack exchange,提问作者Elabbasy00
相关产品推荐
相关产品推荐

