外观
Memcached 连接指标
关键连接指标
1. 连接数量指标
curr_connections
- 定义:当前活跃的连接数
- 作用:了解当前 Memcached 服务器的连接负载
- 合理范围:根据
max_connections配置,建议在 70% 以下 - 监控频率:1-5 秒
- 异常情况:
- 突然增加:可能是连接泄漏或业务流量增长
- 接近
max_connections:可能导致新连接被拒绝
total_connections
- 定义:自服务器启动以来的总连接数
- 作用:了解服务器的连接处理能力
- 合理范围:根据业务需求和服务器性能,无固定值
- 监控频率:10-60 秒
- 异常情况:
- 增长过快:可能是连接频繁建立和关闭
- 增长停滞:可能是服务器无法接受新连接
rejected_connections
- 定义:被拒绝的连接数
- 作用:了解服务器无法处理的连接请求数量
- 合理范围:0 或接近 0
- 监控频率:10-60 秒
- 异常情况:
- 持续增加:可能是
max_connections设置过小或服务器资源不足 - 突然增加:可能是突发流量或 DDoS 攻击
- 持续增加:可能是
max_connections
- 定义:配置的最大连接数
- 作用:了解服务器的连接容量
- 合理范围:根据服务器资源和业务需求配置
- 监控频率:静态配置,无需频繁监控
- 调整建议:根据
curr_connections和rejected_connections动态调整
2. 连接质量指标
connection_structures
- 定义:当前分配的连接结构数量
- 作用:了解连接结构的使用情况
- 合理范围:略大于
curr_connections - 监控频率:10-60 秒
- 异常情况:
- 远大于
curr_connections:可能是连接结构泄漏 - 接近系统限制:可能导致无法分配新的连接结构
- 远大于
conn_yields
- 定义:连接线程主动让出 CPU 的次数
- 作用:了解连接线程的调度情况
- 合理范围:根据线程数和负载,无固定值
- 监控频率:10-60 秒
- 异常情况:
- 持续增加:可能是线程数配置不合理
- 突然增加:可能是系统负载过高
auth_cmds
- 定义:认证命令的数量
- 作用:了解认证请求的数量
- 合理范围:根据认证配置和业务需求
- 监控频率:10-60 秒
- 异常情况:
- 突然增加:可能是认证攻击
- 远大于
curr_connections:可能是认证失败重试
auth_errors
- 定义:认证失败的次数
- 作用:了解认证失败的情况
- 合理范围:0 或接近 0
- 监控频率:10-60 秒
- 异常情况:
- 持续增加:可能是认证配置错误或认证攻击
- 与
auth_cmds比例过高:可能是客户端配置错误
3. 连接性能指标
bytes_read
- 定义:自服务器启动以来读取的字节数
- 作用:了解连接的网络输入流量
- 合理范围:根据业务需求和网络带宽
- 监控频率:10-60 秒
- 异常情况:
- 突然增加:可能是突发流量或异常请求
- 远大于业务预期:可能是网络攻击
bytes_written
- 定义:自服务器启动以来写入的字节数
- 作用:了解连接的网络输出流量
- 合理范围:根据业务需求和网络带宽
- 监控频率:10-60 秒
- 异常情况:
- 突然增加:可能是突发流量或异常响应
- 远大于业务预期:可能是网络攻击
连接指标监控方法
1. 命令行监控
使用 stats 命令
bash
# 连接到 Memcached 服务器
telnet 127.0.0.1 11211
# 查看所有统计信息
stats
# 退出连接
quit使用 memcached-tool
bash
# 查看 Memcached 状态
memcached-tool 127.0.0.1:11211 stats2. 监控工具
Prometheus + Grafana
配置步骤:
- 安装 Prometheus 和 Grafana
- 安装 Memcached Exporter
- 配置 Prometheus 抓取 Memcached 指标
- 在 Grafana 中创建连接指标仪表盘
常用仪表盘:
Zabbix
- 配置步骤:
- 安装 Zabbix 服务器和代理
- 导入 Memcached 模板
- 配置 Zabbix 监控项
- 设置连接指标告警
Datadog
- 配置步骤:
- 注册 Datadog 账号
- 安装 Datadog Agent
- 启用 Memcached 集成
- 配置连接指标监控和告警
3. 自定义监控脚本
Python 脚本示例
python
import memcache
import time
# 连接 Memcached
client = memcache.Client(['127.0.0.1:11211'], debug=0)
# 定义监控函数
def monitor_connections():
while True:
# 获取统计信息
stats = client.get_stats()[0][1]
# 提取连接指标
curr_connections = int(stats['curr_connections'])
total_connections = int(stats['total_connections'])
rejected_connections = int(stats['rejected_connections'])
connection_structures = int(stats['connection_structures'])
conn_yields = int(stats['conn_yields'])
# 打印指标
print(f"当前时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
print(f"当前连接数: {curr_connections}")
print(f"总连接数: {total_connections}")
print(f"被拒绝连接数: {rejected_connections}")
print(f"连接结构数: {connection_structures}")
print(f"连接线程让出次数: {conn_yields}")
print("=" * 50)
# 休眠 10 秒
time.sleep(10)
# 执行监控
if __name__ == '__main__':
monitor_connections()连接指标优化
1. 连接数量优化
调整 max_connections
- 原则:根据服务器资源和业务需求调整
- 方法:bash
# 启动时设置最大连接数 memcached -c 2048 # 或在配置文件中设置 MAXCONN=2048 - 建议:设置为实际峰值连接数的 1.5-2 倍
优化连接池配置
- 客户端连接池:使用连接池管理连接,减少连接建立和关闭开销
- 连接池大小:根据业务并发量调整连接池大小
- 连接超时时间:合理设置连接超时时间,避免连接长时间占用
减少连接频繁建立和关闭
- 长连接:使用长连接替代短连接
- 连接复用:复用现有连接,避免频繁建立新连接
- 批量操作:将多个小请求合并为一个大请求,减少网络往返次数
2. 连接质量优化
优化线程配置
- 线程数:根据 CPU 核心数调整线程数bash
# 启动时设置线程数 memcached -t 4 - 线程优先级:合理设置线程优先级,避免线程饥饿
优化网络配置
TCP 缓冲区:调整 TCP 缓冲区大小,提高网络性能
bash# 在 /etc/sysctl.conf 中设置 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216TCP_NODELAY:启用 TCP_NODELAY,减少网络延迟
bash# 在 Memcached 启动时启用 memcached -o tcp_nodelay
优化认证配置
启用认证:对于敏感数据,启用 SASL 认证
bash# 启动时启用 SASL memcached -S优化认证机制:选择高效的认证机制,减少认证开销
3. 连接安全优化
限制连接来源
防火墙规则:只允许特定 IP 访问 Memcached 端口
bash# iptables 规则示例 iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 11211 -j ACCEPT iptables -A INPUT -p tcp --dport 11211 -j DROP绑定特定 IP:将 Memcached 绑定到特定 IP,避免公网访问
bash# 启动时绑定 IP memcached -l 192.168.1.100
防止 DDoS 攻击
- 连接限速:限制单个 IP 的连接速率
- 连接超时:设置合理的连接超时时间,避免连接占用资源
- 监控异常连接:监控异常连接模式,及时发现 DDoS 攻击
连接指标异常处理
1. 连接数过高
症状:
curr_connections接近max_connectionsrejected_connections持续增加- 客户端无法连接到 Memcached
处理步骤:
- 检查业务流量,确认是否是正常增长
- 检查客户端连接池配置,是否存在连接泄漏
- 临时增加
max_connections,缓解当前压力 - 分析连接来源,是否存在异常连接
- 考虑扩容 Memcached 节点,分担连接负载
2. 连接数突然增加
症状:
curr_connections突然增加- 连接来源 IP 分布异常
- 可能伴随
rejected_connections增加
处理步骤:
- 分析连接来源 IP,识别异常来源
- 检查客户端应用程序,是否存在连接泄漏
- 检查业务日志,确认是否是正常业务增长
- 临时限制异常 IP 的访问
- 优化客户端连接池配置,减少连接数
3. 连接数持续增长但业务流量正常
症状:
curr_connections持续增长total_connections增长过快- 业务流量没有明显变化
处理步骤:
- 检查客户端应用程序,是否存在连接泄漏
- 检查连接关闭逻辑,是否正常关闭连接
- 分析连接生命周期,是否存在长连接未释放
- 重启客户端应用程序,释放泄漏的连接
- 修复客户端连接泄漏问题
4. 连接错误率高
症状:
auth_errors持续增加- 客户端连接时出现认证错误
- 可能伴随连接重试
处理步骤:
- 检查 SASL 配置,确认用户名和密码是否正确
- 检查客户端认证配置,是否与服务器匹配
- 查看认证日志,识别认证错误原因
- 临时禁用认证,确认是否是认证配置问题
- 修复认证配置,重新启用认证
连接指标最佳实践
1. 监控最佳实践
- 选择合适的监控频率:根据指标的变化速率选择监控频率
- 设置合理的告警阈值:
curr_connections> 80% *max_connections:警告告警rejected_connections> 0:严重告警auth_errors> 10/min:警告告警
- 实现多维度监控:结合连接指标、系统指标和业务指标进行综合监控
- 保留足够的历史数据:至少保留 30 天的历史数据,用于趋势分析
2. 配置最佳实践
- 合理设置 max_connections:根据服务器资源和业务需求调整
- 优化线程配置:线程数建议与 CPU 核心数相同或略少
- 启用 TCP_NODELAY:减少网络延迟
- 限制连接来源:只允许特定 IP 访问
- 使用长连接:减少连接建立和关闭开销
3. 客户端最佳实践
- 使用连接池:管理连接生命周期,减少连接开销
- 合理设置连接超时:避免连接长时间占用
- 实现连接重试机制:处理临时连接失败
- 批量操作:减少网络往返次数
- 监控连接池状态:及时发现连接泄漏
4. 扩容最佳实践
- 根据连接指标进行扩容:当
curr_connections持续超过 70% 时考虑扩容 - 使用一致性哈希:支持动态扩容,减少数据迁移
- 实现平滑扩容:分批次添加节点,减少对业务的影响
- 监控扩容后的连接分布:确保连接负载均衡
连接指标案例分析
1. 电商平台连接泄漏案例
背景:
- 电商平台 Memcached
curr_connections持续增长 - 从正常的 500 左右增长到 2000 以上
max_connections设置为 2048,接近上限
- 电商平台 Memcached
分析过程:
- 检查业务流量,确认没有明显增长
- 分析连接来源,主要来自几个应用服务器
- 检查应用服务器日志,发现连接数持续增长
- 检查客户端代码,发现存在连接泄漏,连接没有正确关闭
处理过程:
- 紧急重启应用服务器,释放泄漏的连接
- 修复客户端代码,确保连接正确关闭
- 实现连接池监控,及时发现连接泄漏
- 调整
max_connections为 4096,增加缓冲
结果:
curr_connections恢复到 500 左右- 未再出现连接泄漏问题
- 建立了连接泄漏监控机制
2. 社交平台 DDoS 攻击案例
背景:
- 社交平台 Memcached
curr_connections突然增加到 10000+ rejected_connections持续增加- 连接来源 IP 分布异常,来自多个陌生 IP
- 社交平台 Memcached
分析过程:
- 分析连接来源 IP,确认是 DDoS 攻击
- 检查防火墙规则,发现 Memcached 端口暴露在公网
- 确认攻击流量主要针对 Memcached 端口
处理过程:
- 紧急修改防火墙规则,只允许内部 IP 访问
- 重启 Memcached 服务,清除现有连接
- 启用连接限速,限制单个 IP 的连接速率
- 监控攻击流量,确认攻击是否停止
结果:
- 攻击被成功拦截
curr_connections恢复正常- 加强了 Memcached 的安全配置
常见问题(FAQ)
Q1: 如何确定 Memcached 的最佳连接数?
A1: 确定 Memcached 最佳连接数的方法:
- 根据业务并发量和服务器性能进行压测
- 监控
curr_connections和rejected_connections指标 - 考虑服务器的 CPU、内存和网络资源
- 建议设置为实际峰值连接数的 1.5-2 倍
Q2: 连接数过高会影响 Memcached 性能吗?
A2: 连接数过高会影响 Memcached 性能:
- 每个连接占用一定的内存和 CPU 资源
- 过多连接会导致上下文切换开销增加
- 可能导致网络栈压力过大
- 建议将连接数控制在合理范围,避免资源浪费
Q3: 如何识别连接泄漏?
A3: 识别连接泄漏的方法:
- 监控
curr_connections,如果持续增长而业务流量没有相应增长,可能存在连接泄漏 - 检查客户端应用程序日志,寻找连接相关错误
- 使用
lsof或netstat命令查看连接状态 - 分析连接来源,识别异常连接
Q4: 如何优化客户端连接池?
A4: 优化客户端连接池的方法:
- 根据业务并发量调整连接池大小
- 设置合理的连接超时时间
- 实现连接健康检查,及时剔除不健康的连接
- 监控连接池状态,及时发现问题
- 考虑使用异步连接池,提高并发处理能力
Q5: 如何防止 Memcached 连接被攻击?
A5: 防止 Memcached 连接被攻击的方法:
- 限制连接来源 IP,只允许内部 IP 访问
- 不将 Memcached 端口暴露在公网
- 启用 SASL 认证,增加连接安全性
- 监控连接指标,及时发现异常连接
- 考虑使用防火墙或 WAF 保护 Memcached
Q6: 如何监控 Memcached 的连接分布?
A6: 监控 Memcached 连接分布的方法:
- 使用
netstat或ss命令查看连接来源bashnetstat -an | grep 11211 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr - 使用监控工具,如 Prometheus + Grafana,可视化连接分布
- 编写自定义脚本,定期分析连接来源
Q7: 连接线程让出次数(conn_yields)过高怎么办?
A7: 处理 conn_yields 过高的方法:
- 检查线程数配置,是否与 CPU 核心数匹配
- 分析系统负载,是否存在 CPU 瓶颈
- 优化 Memcached 配置,减少线程竞争
- 考虑升级硬件,增加 CPU 资源
- 考虑分流连接,减轻单个节点的连接压力
Q8: 如何处理大量短连接?
A8: 处理大量短连接的方法:
- 鼓励客户端使用长连接
- 优化客户端连接池配置,减少连接建立和关闭
- 调整操作系统参数,优化短连接处理bash
# 调整 TCP 时间戳 echo 1 > /proc/sys/net/ipv4/tcp_timestamps # 调整 TCP 连接超时 echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout - 考虑使用连接复用技术,减少短连接数量
Q9: 云环境下如何优化 Memcached 连接?
A9: 云环境下优化 Memcached 连接的方法:
- 使用云服务提供商的托管 Memcached 服务,如 AWS ElastiCache
- 将 Memcached 与客户端部署在同一可用区,减少网络延迟
- 优化云网络配置,确保足够的带宽
- 利用云负载均衡,分散连接负载
- 使用云监控服务,监控连接指标
Q10: 如何实现 Memcached 连接的自动伸缩?
A10: 实现 Memcached 连接自动伸缩的方法:
- 监控
curr_connections和rejected_connections指标 - 当连接指标超过阈值时,自动添加 Memcached 节点
- 当连接指标低于阈值时,考虑减少 Memcached 节点
- 使用容器编排工具,如 Kubernetes,实现自动扩缩容
- 结合监控工具和自动化脚本,实现闭环自动伸缩
