DRF列表API响应缓慢致CPU限流,生产环境异常排查求助
问题描述
项目中某个DRF API在本地运行正常,但生产环境调用时会导致全应用响应变慢(包含所有其他API),且容器负载被限流约10秒。
相关代码如下:
models.py
class Event(BaseModel): user = models.ForeignKey(User, related_name="events", on_delete=models.CASCADE) other_organizers = models.ManyToManyField(User, related_name="organized_events") teachers = models.ManyToManyField(User, related_name="teached_events") sponsors = models.ManyToManyField(User, related_name="sponsored_events") uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) title = models.CharField(max_length=150) slug = models.SlugField(max_length=300, unique=True) ...
views.py
@action( detail=False, serializer_class=UserEventListSerializer, url_path='user-events' ) def user_events(self, request): ''' Retrieves all events in which the user has participated. ''' user = get_object_or_404(User, username=self.request.query_params.get('username')) queryset = self.filter_queryset(self.get_queryset()) queryset = queryset.filter( Q(user=user) | Q(other_organizers=user) | Q(teachers=user) | Q(sponsors=user) ) page = self.paginate_queryset(queryset) serializer = self.get_serializer( page, many=True, context={'user': user, 'request': self.request} ) return self.get_paginated_response(serializer.data)
已排除的可能性:
- 本地Django Shell执行相同查询正常,暂不认为是Q对象OR过滤本身的语法问题
- 同一序列化器在其他API中运行正常,排除序列化器问题
可能的原因分析
- 数据库索引缺失:生产环境数据量远大于本地,多表OR查询未建立对应索引,导致全表扫描。需检查
Event.user(Django外键默认建索引,但需确认)、多对多关联表(如event_other_organizers、event_teachers、event_sponsors)的user_id字段是否有索引。 - 数据库连接池耗尽:该查询执行时间长,占用数据库连接不释放;生产环境并发请求下连接池被占满,其他API请求等待连接超时,引发全应用变慢。
- 未优化的查询执行计划:本地数据量小,查询计划高效;生产环境数据量大时,OR查询的执行计划退化,比如无法使用索引,转而执行全表扫描。可通过
EXPLAIN ANALYZE在生产数据库中查看该查询的执行计划。 - 分页未生效或优化不足:虽然代码中调用了分页,但如果
get_queryset()返回的查询集包含大量未预加载的关联数据,或者分页逻辑是先拉取全部符合条件的数据再切片,会导致查询耗时极长,占用大量资源。 - 数据库锁竞争:该查询扫描大量行时可能引发表级锁或行锁,阻塞其他API的数据库操作,导致全应用响应延迟。
- 生产环境资源限制:容器的CPU、内存配额不足,查询时占用大量资源触发限流,挤压其他API的资源分配空间,导致整体响应变慢。
- 缓存缺失:本地测试可能依赖缓存,生产环境未配置查询缓存,每次调用都触发全量数据库查询,叠加并发请求后资源占用飙升。
内容的提问来源于stack exchange,提问作者sajad
相关产品推荐
相关产品推荐

