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和带宽均处于低负载状态,无明显异常
待解决问题
- 哪些因素可能导致Redis请求偶发缓慢?
- 如何更有效地调试该问题?
当前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
相关产品推荐
相关产品推荐

