Django网站性能测试时RPS过低的问题求助
Django网站性能测试时RPS过低的问题求助
各位大佬好,最近在给我的Django网站做性能测试的时候,发现RPS(每秒请求数)低得离谱,愁死我了!先给大家看看我目前用来做页面缓存的代码片段,本来想靠这个60分钟的页面缓存提升性能,但好像没达到预期:
import os import time from django.conf import settings from django.core.cache import cache from django.core.mail import send_mail from django.contrib import messages from django.http import FileResponse, Http404, HttpResponse from django.shortcuts import render from django.utils.translation import get_language, gettext as _ from apps.newProduct.models import Product, Variants, Category from apps.vendor.models import Us # 后续逻辑是尝试从缓存读取页面,未命中则渲染页面并存入缓存
我自己折腾了好一阵还是没摸到核心问题,想请教下大家可能的原因和解决方向:
- 缓存后端是不是选错了? 我目前用的是Django默认缓存配置,会不会是用了LocMemCache?之前听人说这个缓存是单进程的,压力测试下根本起不到高效缓存的作用,是不是得换成Redis或者Memcached这种分布式缓存?
- 缓存命中率是不是太低? 我设置的缓存键是不是不够合理?比如有没有结合当前语言、请求路径这些唯一标识?会不会每次请求的缓存键都不一样,导致根本没命中缓存,每次都要重新渲染页面?
- 数据库查询拖了后腿? 就算有页面缓存,第一次渲染页面的时候,查询Product、Variants这些模型数据会不会有N+1查询的问题?比如我在视图里循环查每个Product的Variants,没用到
select_related或者prefetch_related,导致数据库查询次数爆炸,第一次渲染就慢得要死,缓存生成也跟不上? - 静态资源没做分流? 测试的时候静态资源(CSS、JS、图片)是不是还在通过Django处理?是不是应该把这些静态资源交给Nginx或者专门的静态文件服务器托管,别让Django同时扛动态请求和静态资源的压力?
- 服务器进程配置不合理? 我用Gunicorn部署的,worker数只设了2个,是不是太少了?是不是应该根据服务器的CPU核心数调整worker数(比如2*CPU核心+1),同时调整worker的线程数?
- 视图逻辑有冗余? 我的视图里是不是写了很多没必要的逻辑?比如导入了一堆当前视图用不到的模块(比如send_mail、messages),或者有多余的计算、判断,拖慢了视图的处理速度?
另外我还想问问,有没有靠谱的排查方法?比如用Django Debug Toolbar能不能看到每个请求的缓存命中情况、数据库查询耗时?或者用压力测试工具的时候,先测一个纯静态的视图看看服务器的基准RPS,再对比我的业务视图,这样就能定位到底是业务逻辑的问题还是配置的问题?
麻烦各位大佬给点思路,实在是卡在这里好久了!
内容来源于stack exchange
相关产品推荐
相关产品推荐

