在 2核4G内存 的服务器上同时运行 MySQL 和 Redis,资源较为紧张,因此需要合理优化两者配置,避免内存溢出或CPU争抢导致性能下降。以下是详细的优化建议:
一、总体资源分配建议(参考)
| 组件 | 建议内存上限 | CPU使用 | 备注 |
|---|---|---|---|
| MySQL | 2.0 – 2.5 GB | 1-2核 | 主要占用内存和I/O |
| Redis | 0.8 – 1.2 GB | 轻量级,单线程 | 内存敏感 |
| 系统+其他 | ≥0.5 GB | – | 预留系统缓存和进程 |
✅ 总计:约 3.5GB 使用 + 0.5GB 预留 = 4GB
二、Redis 优化配置
1. 限制最大内存
编辑 redis.conf:
maxmemory 1gb
maxmemory-policy allkeys-lru
maxmemory: 强制限制 Redis 最大使用内存,防止OOM。maxmemory-policy: 推荐allkeys-lru(最近最少使用淘汰),适合缓存场景。
⚠️ 若数据必须持久化且不能丢失,考虑用
volatile-lru并设置过期时间。
2. 关闭持久化(可选)
若为纯缓存用途,可关闭持久化以减少磁盘I/O和CPU占用:
save ""
# 注释掉所有 save 指令
或改为低频保存:
save 900 1
save 300 10
3. 启用 AOF 时优化
如需开启AOF:
appendonly yes
appendfsync everysec
everysec:平衡性能与数据安全。
4. 其他轻量配置
tcp-keepalive 60
timeout 300
stop-writes-on-bgsave-error yes
三、MySQL 优化配置
编辑 my.cnf(通常位于 /etc/mysql/my.cnf 或 /etc/my.cnf)
1. 关键参数调优(适用于 2核4G,InnoDB)
[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip-name-resolve
performance_schema=OFF # 节省内存
# 内存相关
key_buffer_size = 32M # MyISAM索引缓存,小即可
max_allowed_packet = 64M
table_open_cache = 400 # 减少打开表的开销
tmp_table_size = 64M
max_heap_table_size = 64M
# InnoDB 设置(重点)
innodb_buffer_pool_size = 1536M # 推荐值:1.5G,不超过总内存50%
innodb_log_file_size = 128M # 可设为128M~256M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 2 # 提高性能,牺牲一点持久性
innodb_flush_method = O_DIRECT
innodb_file_per_table = ON
# 连接数控制
max_connections = 100 # 避免过高连接耗尽内存
wait_timeout = 60
interactive_timeout = 60
🔍
innodb_buffer_pool_size是最关键的参数,建议设置为 1.5G ~ 1.8G,给Redis和其他服务留空间。
2. 禁用不必要的插件/功能
# 如不需要,禁用
performance_schema = OFF
# skip-slave-start(如非从库)
四、系统级优化
1. 使用 swap 分区(防OOM)
虽然swap慢,但可防止崩溃:
# 创建1GB swap(如未设置)
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
添加到 /etc/fstab 永久生效。
2. 调整内核参数(可选)
# /etc/sysctl.conf
vm.swappiness=10 # 降低使用swap倾向
vm.overcommit_memory=1 # Redis推荐设置
执行 sysctl -p 生效。
3. 监控资源使用
使用工具监控:
htop # 查看CPU/内存
free -h # 内存使用
df -h # 磁盘空间
mysqladmin -u root -p status # MySQL状态
redis-cli info memory # Redis内存信息
五、部署建议
| 项目 | 建议 |
|---|---|
| 是否同机部署? | 小型项目可接受,生产环境建议分离 |
| 定时任务 | 避免高峰时段执行备份等重负载操作 |
| 日志轮转 | 开启 logrotate,防止日志占满磁盘 |
| 备份策略 | 使用 mysqldump + redis RDB/AOF 定期备份 |
六、常见问题排查
- MySQL 启动失败:检查
innodb_buffer_pool_size是否过大。 - Redis OOM:确认
maxmemory已设置并启用淘汰策略。 - 系统卡顿:查看是否频繁使用 swap,或某个进程内存泄漏。
总结
在 2核4G 环境下共用 MySQL 和 Redis,关键在于:
✅ 严格限制内存使用
✅ 关闭不必要的功能和服务
✅ 合理分配 buffer_pool 和 maxmemory
✅ 监控 + 预留系统资源
示例最终内存分配:
- MySQL: ~1.8G (
innodb_buffer_pool)- Redis: 1.0G (
maxmemory)- 系统及其他:1.2G(含缓存、swap缓冲)
通过精细调优,可以在有限资源下稳定运行中小型应用。如流量增长,建议尽早拆分服务。
云计算