Redis和MySQL共用服务器时如何优化内存使用?

当 Redis 和 MySQL 共用同一台服务器时,内存竞争是核心挑战。以下是系统化的优化策略,兼顾性能与稳定性:

一、核心原则:隔离资源 + 动态控制

  1. 明确内存预算

    • 预留 OS 缓存(Linux 默认约 25%~30% 用于 page cache)
    • 为 MySQL 分配 innodb_buffer_pool_size(建议占可用内存的 60%~70%,但需结合业务负载调整)
    • 剩余内存再分配给 Redis(通常不超过总内存的 30%~40%)
  2. 启用内存限制机制

    # Redis 配置 (redis.conf)
    maxmemory 2gb              # 硬上限(避免 OOM)
    maxmemory-policy allkeys-lru  # 淘汰策略(生产推荐 allkeys-lru/allkeys-random)
    maxmemory-samples 10       # LRU 采样精度(平衡性能与准确性)
    
    # MySQL 配置 (my.cnf)
    innodb_buffer_pool_size = 8G  # 根据实际内存动态计算
    innodb_log_file_size = 512M   # 减少 spill-to-disk 风险
    tmp_table_size = 256M         # 防止临时表占用过多内存

二、关键优化技巧

▶ Redis 侧

  • 使用内存碎片整理
    activedefrag yes + lazyfree-lazy-eviction yes(减少阻塞)
  • 压缩小对象
    对短字符串启用 rdb-save-on-signal 或手动序列化压缩(如 gzip 存储大 value)
  • 监控关键指标
    redis-cli info memory | grep used_memory_human
    redis-cli --stat  # 实时观察 hit/miss 率

▶ MySQL 侧

  • 禁用非必要功能
    skip-name-resolve      # 避免 DNS 解析开销
    query_cache_type = 0   # MySQL 8.0+ 已移除,旧版本建议关闭
    slow_query_log = 1     # 精准定位长查询
  • 连接池管理
    应用层使用连接池(如 HikariCP),避免 max_connections 过高导致内存泄漏

▶ 系统级协同

  • NUMA 架构优化(多路 CPU 服务器)
    numactl --interleave=all redis-server /etc/redis.conf
    mysql --defaults-file=/etc/my.cnf --numa-interleave
  • cgroups 资源限制(容器化场景)
    # Docker Compose 示例
    services:
    redis:
      mem_limit: 2g
      cpuset: "0-3"
    mysql:
      mem_limit: 8g
      cpuset: "4-7"

三、监控与告警实践

指标 阈值建议 工具
Redis 内存使用率 >85% 触发警告 Prometheus + Grafana
MySQL Buffer Pool Hit Rate <95% 需调优 Percona Monitoring Tools
Swap 使用量 >0(立即告警) zabbix/nagios
OOM Killer 日志 出现即紧急处理 dmesg -T | grep -i oom

四、避坑指南

⚠️ 禁止行为

  • 设置 maxmemory 超过物理内存的 80%
  • MySQL 的 innodb_buffer_pool_size + Redis maxmemory > 总内存 × 0.9
  • 未开启 vm.overcommit_memory=1(Linux 内核参数,允许过度分配)

推荐操作

# 安全配置检查
echo 1 > /proc/sys/vm/overcommit_memory
sysctl -p

# 定期清理碎片
redis-cli MEMORY PURGE
mysql> FLUSH TABLES WITH READ LOCK;  # 仅在维护窗口执行

五、极端场景预案

  • 突发流量冲击:提前配置 redis-cli CONFIG SET maxmemory-policy volatile-lru 动态切换策略
  • MySQL 慢查询爆发:通过 pt-query-digest 分析并添加索引,而非盲目增加 buffer pool
  • 内存泄漏检测:使用 valgrind --tool=memcheck 对自定义脚本进行压力测试

💡 终极建议:若业务增长持续超出单机能力,应优先考虑拆分服务(Redis 独立部署 + MySQL 主从读写分离),而非无限堆叠硬件。共机方案更适合中小规模场景(<50GB 内存需求)。

通过以上组合策略,可在保证稳定性的前提下最大化资源利用率,典型场景下可将整体吞吐提升 30%~50%。

未经允许不得转载:CLOUD云枢 » Redis和MySQL共用服务器时如何优化内存使用?