CentOS7部署的Django项目Gunicorn启动/重启后变慢问题求助
排查方向与解决方案
1. 检查Gunicorn Worker内存泄漏与状态
- 实时监控Gunicorn Worker的内存占用:
观察每个worker进程的ps aux | grep gunicornRES(常驻内存)数值,如果重启后持续增长,说明存在内存泄漏。此时可临时通过配置--max-requests 1000让worker处理指定数量请求后自动重启,缓解内存累积:
修改Gunicorn服务的ExecStart行:ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 3 --bind unix:/home/user/myproject/myproject.sock --max-requests 1000 --timeout 30 myproject.wsgi:application - 用
htop持续追踪worker进程的资源变化,确认是否有内存异常飙升的情况。
2. 优化Gunicorn配置参数
- 调整worker数量:推荐worker数量为
2*CPU核心数 + 1,先查看CPU核心数:
比如CPU核心为4,则设置nproc--workers 9,替换原配置中的--workers 3,避免请求排队。 - 修正Unix Socket权限:添加
--umask 0002确保Nginx能正常读写sock文件,防止请求转发阻塞:ExecStart=/home/user/myproject/myprojectenv/bin/gunicorn --workers 9 --bind unix:/home/user/myproject/myproject.sock --umask 0002 --max-requests 1000 --timeout 30 myproject.wsgi:application
3. 排查Nginx连接与日志
- 查看Nginx错误日志与访问日志,检查是否存在请求超时或排队记录:
tail -f /var/log/nginx/error.log tail -f /var/log/nginx/access.log - 调整Nginx连接数限制:在
nginx.conf的events块中增加:
重启Nginx生效:worker_connections 4096;systemctl restart nginx - 检查Nginx连接状态,排查是否有大量连接堆积:
ss -tulpn | grep nginx
4. 定位Django应用内部耗时点
- 开启Django请求耗时日志,在
settings.py中添加:
重启Gunicorn后,查看日志中LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console': { 'class': 'logging.StreamHandler', }, }, 'loggers': { 'django.request': { 'handlers': ['console'], 'level': 'INFO', 'propagate': False, }, }, }django.request的记录,找出耗时最长的请求。 - 检查是否有定时任务(如Celery、crontab)在重启后几分钟启动,占用系统IO或内存资源。
- 排查第三方API/服务调用是否存在延迟,这类外部依赖的缓慢会导致Django请求阻塞。
5. 系统层面隐性问题排查
- 检查磁盘IO负载:
关注iostat -x 1%util列,若接近100%说明磁盘IO瓶颈,需排查是否有大量文件读写或swap频繁触发。 - 查看内存与swap使用情况:
若剩余内存不足且swap占用过高,会导致进程响应变慢,可考虑增加物理内存或优化应用内存占用。free -h - 临时关闭SELinux测试:
若问题缓解,说明SELinux存在隐性权限限制,需配置对应规则而非永久关闭。setenforce 0
内容的提问来源于stack exchange,提问作者Muzaffarmirzo Choriyev
相关产品推荐
相关产品推荐

