Skip to content

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_connectionsrejected_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 stats

2. 监控工具

Prometheus + Grafana

  • 配置步骤

    1. 安装 Prometheus 和 Grafana
    2. 安装 Memcached Exporter
    3. 配置 Prometheus 抓取 Memcached 指标
    4. 在 Grafana 中创建连接指标仪表盘
  • 常用仪表盘

Zabbix

  • 配置步骤
    1. 安装 Zabbix 服务器和代理
    2. 导入 Memcached 模板
    3. 配置 Zabbix 监控项
    4. 设置连接指标告警

Datadog

  • 配置步骤
    1. 注册 Datadog 账号
    2. 安装 Datadog Agent
    3. 启用 Memcached 集成
    4. 配置连接指标监控和告警

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 16777216
  • TCP_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_connections
    • rejected_connections 持续增加
    • 客户端无法连接到 Memcached
  • 处理步骤

    1. 检查业务流量,确认是否是正常增长
    2. 检查客户端连接池配置,是否存在连接泄漏
    3. 临时增加 max_connections,缓解当前压力
    4. 分析连接来源,是否存在异常连接
    5. 考虑扩容 Memcached 节点,分担连接负载

2. 连接数突然增加

  • 症状

    • curr_connections 突然增加
    • 连接来源 IP 分布异常
    • 可能伴随 rejected_connections 增加
  • 处理步骤

    1. 分析连接来源 IP,识别异常来源
    2. 检查客户端应用程序,是否存在连接泄漏
    3. 检查业务日志,确认是否是正常业务增长
    4. 临时限制异常 IP 的访问
    5. 优化客户端连接池配置,减少连接数

3. 连接数持续增长但业务流量正常

  • 症状

    • curr_connections 持续增长
    • total_connections 增长过快
    • 业务流量没有明显变化
  • 处理步骤

    1. 检查客户端应用程序,是否存在连接泄漏
    2. 检查连接关闭逻辑,是否正常关闭连接
    3. 分析连接生命周期,是否存在长连接未释放
    4. 重启客户端应用程序,释放泄漏的连接
    5. 修复客户端连接泄漏问题

4. 连接错误率高

  • 症状

    • auth_errors 持续增加
    • 客户端连接时出现认证错误
    • 可能伴随连接重试
  • 处理步骤

    1. 检查 SASL 配置,确认用户名和密码是否正确
    2. 检查客户端认证配置,是否与服务器匹配
    3. 查看认证日志,识别认证错误原因
    4. 临时禁用认证,确认是否是认证配置问题
    5. 修复认证配置,重新启用认证

连接指标最佳实践

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,接近上限
  • 分析过程

    1. 检查业务流量,确认没有明显增长
    2. 分析连接来源,主要来自几个应用服务器
    3. 检查应用服务器日志,发现连接数持续增长
    4. 检查客户端代码,发现存在连接泄漏,连接没有正确关闭
  • 处理过程

    1. 紧急重启应用服务器,释放泄漏的连接
    2. 修复客户端代码,确保连接正确关闭
    3. 实现连接池监控,及时发现连接泄漏
    4. 调整 max_connections 为 4096,增加缓冲
  • 结果

    • curr_connections 恢复到 500 左右
    • 未再出现连接泄漏问题
    • 建立了连接泄漏监控机制

2. 社交平台 DDoS 攻击案例

  • 背景

    • 社交平台 Memcached curr_connections 突然增加到 10000+
    • rejected_connections 持续增加
    • 连接来源 IP 分布异常,来自多个陌生 IP
  • 分析过程

    1. 分析连接来源 IP,确认是 DDoS 攻击
    2. 检查防火墙规则,发现 Memcached 端口暴露在公网
    3. 确认攻击流量主要针对 Memcached 端口
  • 处理过程

    1. 紧急修改防火墙规则,只允许内部 IP 访问
    2. 重启 Memcached 服务,清除现有连接
    3. 启用连接限速,限制单个 IP 的连接速率
    4. 监控攻击流量,确认攻击是否停止
  • 结果

    • 攻击被成功拦截
    • curr_connections 恢复正常
    • 加强了 Memcached 的安全配置

常见问题(FAQ)

Q1: 如何确定 Memcached 的最佳连接数?

A1: 确定 Memcached 最佳连接数的方法:

  • 根据业务并发量和服务器性能进行压测
  • 监控 curr_connectionsrejected_connections 指标
  • 考虑服务器的 CPU、内存和网络资源
  • 建议设置为实际峰值连接数的 1.5-2 倍

Q2: 连接数过高会影响 Memcached 性能吗?

A2: 连接数过高会影响 Memcached 性能:

  • 每个连接占用一定的内存和 CPU 资源
  • 过多连接会导致上下文切换开销增加
  • 可能导致网络栈压力过大
  • 建议将连接数控制在合理范围,避免资源浪费

Q3: 如何识别连接泄漏?

A3: 识别连接泄漏的方法:

  • 监控 curr_connections,如果持续增长而业务流量没有相应增长,可能存在连接泄漏
  • 检查客户端应用程序日志,寻找连接相关错误
  • 使用 lsofnetstat 命令查看连接状态
  • 分析连接来源,识别异常连接

Q4: 如何优化客户端连接池?

A4: 优化客户端连接池的方法:

  • 根据业务并发量调整连接池大小
  • 设置合理的连接超时时间
  • 实现连接健康检查,及时剔除不健康的连接
  • 监控连接池状态,及时发现问题
  • 考虑使用异步连接池,提高并发处理能力

Q5: 如何防止 Memcached 连接被攻击?

A5: 防止 Memcached 连接被攻击的方法:

  • 限制连接来源 IP,只允许内部 IP 访问
  • 不将 Memcached 端口暴露在公网
  • 启用 SASL 认证,增加连接安全性
  • 监控连接指标,及时发现异常连接
  • 考虑使用防火墙或 WAF 保护 Memcached

Q6: 如何监控 Memcached 的连接分布?

A6: 监控 Memcached 连接分布的方法:

  • 使用 netstatss 命令查看连接来源
    bash
    netstat -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_connectionsrejected_connections 指标
  • 当连接指标超过阈值时,自动添加 Memcached 节点
  • 当连接指标低于阈值时,考虑减少 Memcached 节点
  • 使用容器编排工具,如 Kubernetes,实现自动扩缩容
  • 结合监控工具和自动化脚本,实现闭环自动伸缩