Django搭配Memcached出现大量连接被拒绝:是否正常?原因何在?
memcached大量连接被拒绝:是否正常及根因分析
结论先行
这种规模的连接拒绝完全不正常——rejected_connections几乎等于total_connections,说明memcached几乎无法处理来自Django的连接请求,直接导致缓存失效、应用性能雪崩,必须紧急排查。
可能的原因
1. PyMemcache未启用连接池,引发连接请求风暴
你当前使用的PyMemcacheCache后端默认不启用连接池,Django的12个WSGI进程×12个线程=144个并发线程,每个线程在每次缓存操作时都会新建一条TCP连接到memcached。当应用请求量上来时,短时间内会爆发大量连接请求,一旦超过memcached的TCP监听队列(默认-b 1024)或内核的somaxconn限制,内核会直接拒绝后续连接,这就是rejected_connections激增的核心原因之一。
2. memcached连接复用失效
从统计数据看curr_connections=1(仅你当前的telnet连接),说明memcached几乎没有维持来自Django的持久连接,大概率是客户端未做连接复用:
- 没有配置连接池的情况下,每次缓存操作结束后连接被直接关闭,客户端不得不反复重建连接;
- 若memcached配置了过短的连接空闲超时(默认无强制超时,但部分环境会通过运维配置添加),也会导致连接被快速销毁,加剧连接重建频率。
3. 内核级连接限制卡脖子
Ubuntu系统的TCP内核参数可能限制了memcached的连接处理能力:
net.core.somaxconn:控制TCP监听队列的最大长度,默认值可能低于memcached的-b配置,导致队列溢出;net.ipv4.tcp_max_syn_backlog:SYN握手队列的上限,短时间大量连接请求会填满队列,触发内核拒绝。
4. 版本兼容性问题
你用的memcached 1.5.22是2020年的旧版本,而Django 4.6.2是2024年的新版本,PyMemcacheCache后端在连接协议、超时处理上可能与旧版memcached存在兼容性问题,导致连接建立失败被拒绝。
快速修复建议
- 给Django配置连接池,匹配WSGI总线程数,避免频繁新建连接:
'default': { 'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache', 'LOCATION': '127.0.0.1:11211', 'OPTIONS': { 'connection_pool_kwargs': { 'maxsize': 144, # 对应12进程×12线程 'timeout': 30 } } } - 调整memcached启动参数,增大TCP监听队列:
# 在memcached启动命令中添加-b参数 memcached -m 1024 -p 11211 -l 127.0.0.1 -I 32M -b 2048 - 临时调整内核参数(需持久化到
/etc/sysctl.conf重启生效):sysctl -w net.core.somaxconn=2048 sysctl -w net.ipv4.tcp_max_syn_backlog=2048 - 升级memcached到1.6.x或更高版本,排查兼容性问题。
内容的提问来源于stack exchange,提问作者xioxox
相关产品推荐
相关产品推荐

