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

Django应用中Redis请求偶发缓慢问题排查咨询

偶发Redis请求慢问题排查

问题现象

我们的Django应用使用django-redis包将Redis作为缓存后端,整体运行正常,但偶尔会出现Redis请求响应缓慢的情况,耗时从数百毫秒到4-5秒不等。受影响的均为针对不同键的简单GET和SET请求,部分键值大小可达180KB,但小值键也会出现该问题。

通过Sentry的性能数据功能识别到这类慢请求,每天仅出现1-2次,暂未发现特定规律或复现方式。

Redis的slowlog未记录这些慢请求,其中最慢的查询约200ms,与Sentry中观测到的慢请求无关。

部署环境

整套环境基于OpenTelekomCloud(一种OpenStack实例):

  • Django应用运行在Kubernetes集群的多个Pod中
  • Redis为服务商提供的托管实例,与Kubernetes处于同一VPC和子网
  • Redis几乎仅作为应用缓存后端使用,同时作为Celery的消息broker

已排查的监控数据

Redis服务器指标

  • CPU使用率约3-5%,内存使用率30%,资源充足
  • 峰值连接客户端约500个,每秒操作数约500,带宽占用5%

应用侧指标

CPU和带宽均处于低负载状态,无明显异常

待解决问题

  1. 哪些因素可能导致Redis请求偶发缓慢?
  2. 如何更有效地调试该问题?

当前Django缓存配置

{'default': {'BACKEND': 'django_redis.cache.RedisCache',
             'LOCATION': 'redis://10.0.5.7:6379/0',
             'TIMEOUT': 300,
             'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient',
                         'SOCKET_CONNECT_TIMEOUT': 1,
                         'SOCKET_TIMEOUT': 1}}},

待部署的优化配置

下一次部署计划添加hiredis并设置keepalive参数:

{'default': {'BACKEND': 'django_redis.cache.RedisCache',
             'LOCATION': 'redis://10.0.5.7:6379/0',
             'TIMEOUT': 300,
             'OPTIONS': {'CLIENT_CLASS': 'django_redis.client.DefaultClient',
                         'SOCKET_CONNECT_TIMEOUT': 1,
                         'SOCKET_TIMEOUT': 1,
                         'PARSER_CLASS': 'redis.connection._HiredisParser',
                         'CONNECTION_POOL_KWARGS': {'health_check_interval': 60,
                                                    'socket_keepalive': True,
                                                    'socket_keepalive_options': {4: 30,
                                                                                 5: 30,
                                                                                 6: 50}}}},

注:这些优化有助于提升整体性能,但可能无法解决当前特定的偶发慢请求问题

Redis服务器关键配置

maxclients 10000
maxmemory 2147483648
maxmemory-policy volatile-lru
timeout 300
appendfsync no
appendonly yes

软件版本

  • Django:3.2.21
  • django-redis:5.2.0
  • Redis-Py:5.0.0
  • Redis服务器:5.0

测试情况

曾使用脚本模拟应用缓存请求,以最多100线程向Redis发送GET请求,一定程度上复现了请求耗时数秒的情况,且在Kubernetes集群中以默认配置部署的Redis实例上也能复现。但该测试与生产环境不符,因为生产应用不太可能同时发起如此多的Redis查询,因此认为存在其他导致偶发慢请求的原因。

内容的提问来源于stack exchange,提问作者eht16

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:42:23