在 2 核 2G(2GB 内存)的云服务器上运行 MySQL 5.7,OOM(Out of Memory)是极其常见的问题。这是因为除了 innodb_buffer_pool_size,MySQL 还需要为其他线程、连接、日志缓冲以及操作系统本身预留大量内存。
如果设置不当(例如直接设置为 1G),一旦并发连接数增加或执行复杂查询,剩余内存不足,Linux 内核就会触发 OOM Killer 杀死 MySQL 进程。
以下是针对 2G 内存环境的调整策略和具体操作步骤:
1. 核心原则:不要独占所有内存
MySQL 的内存模型是:总内存 = innodb_buffer_pool_size + 其他组件(sort buffer, join buffer, thread stack, log buffer 等)。
在 2G 服务器上,建议遵循以下经验法则:
- InnoDB Buffer Pool: 占用物理内存的 40% ~ 50%(约 800MB – 1000MB)。
- 其他开销: 预留 30%~40% 给操作系统和其他 MySQL 组件。
- 安全红线: 绝对不要超过物理内存的 60%,否则风险极大。
2. 推荐配置值
对于 2GB 内存,建议将 innodb_buffer_pool_size 设置为 800M 到 900M 之间。
- 保守方案:
800M(最安全,适合高并发或复杂查询场景) - 激进方案:
900M(适合读多写少,且查询相对简单的场景)
注意: 默认值通常是物理内存的 12.5% 或 1/4,对于 2G 机器来说太小(仅 256M 或 512M),导致频繁磁盘 IO,性能极差;调太大则直接 OOM。
3. 如何修改配置
步骤一:备份配置文件
cp /etc/my.cnf /etc/my.cnf.bak
# 或者在某些发行版中是 /etc/mysql/my.cnf
步骤二:编辑配置文件
使用文本编辑器打开配置文件:
vim /etc/my.cnf
找到 [mysqld] 部分(如果没有则新建),添加或修改以下参数:
[mysqld]
# 基础配置
basedir=/usr/local/mysql
datadir=/var/lib/mysql
port=3306
socket=/tmp/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
# --- 核心调整开始 ---
# 设置为 800M 或 900M,根据实际负载微调
innodb_buffer_pool_size = 800M
# 关闭 InnoDB 双写缓冲(可选,极端节省内存,但降低崩溃恢复安全性,一般不建议关)
# innodb_doublewrite = 0
# --- 核心调整结束 ---
# 优化其他内存相关参数,防止连接数过多吃光剩余内存
# 每个连接大约需要 200KB-400KB,限制最大连接数
max_connections = 50
# 临时表大小(避免溢出到磁盘)
tmp_table_size = 32M
max_heap_table_size = 32M
# 排序缓冲区(单个连接)
sort_buffer_size = 256K
join_buffer_size = 256K
# 开启慢查询日志以便排查问题
slow_query_log = 1
long_query_time = 2
步骤三:重启 MySQL 服务
修改后必须重启才能生效:
systemctl restart mysqld
# 或者
service mysql restart
4. 验证与监控
重启后,登录 MySQL 检查配置是否生效:
mysql -u root -p
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW VARIABLES LIKE 'max_connections';
SHOW STATUS LIKE 'Threads_connected';
确保 innodb_buffer_pool_size 显示为 838860800 (800MB) 左右。
持续监控内存使用情况:
在服务器终端使用 free -h 观察:
- Mem total: 2.0G
- Mem available: 应该保持在 400M – 600M 以上。
- 如果
available经常接近 0,说明配置过大,需调小 Buffer Pool。
5. 进阶优化建议(如果调整后仍 OOM)
如果调整到 800M 后仍然 OOM,请检查以下几点:
- 检查大查询: 是否有未加索引的全表扫描?这类查询会消耗大量 Sort Buffer 和 Join Buffer。
- 查看慢查询日志:
cat /var/log/slow.log(路径视配置而定)。
- 查看慢查询日志:
- 限制连接数: 如果业务允许,进一步降低
max_connections(例如设为 30 或 40),减少每个连接占用的非 Buffer Pool 内存。 - 关闭不需要的功能: 如果不需要存储引擎特性,考虑关闭一些不必要的插件。
- 升级硬件: 2G 内存对于生产环境运行 MySQL 非常捉襟见肘。如果可能,升级到 4G 内存是最根本的解决方案,这样可以将
innodb_buffer_pool_size安全地调整为 2G 或 3G,性能会有质的飞跃。
总结
在 2G 云服务器上,请将 innodb_buffer_pool_size 设置为 800M,并将 max_connections 限制在 50 以内。这是平衡性能与稳定性的最佳起点。
云知道CLOUD