当 Redis 和 MySQL 共用同一台服务器时,内存竞争是核心挑战。以下是系统化的优化策略,兼顾性能与稳定性:
一、核心原则:隔离资源 + 动态控制
-
明确内存预算
- 预留 OS 缓存(Linux 默认约 25%~30% 用于 page cache)
- 为 MySQL 分配
innodb_buffer_pool_size(建议占可用内存的 60%~70%,但需结合业务负载调整) - 剩余内存再分配给 Redis(通常不超过总内存的 30%~40%)
-
启用内存限制机制
# 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+ Redismaxmemory> 总内存 × 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云枢