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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 03:43:16