You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 05:02:37