🚨 故障复盘:WordPress 网站频繁崩溃?原来是 MySQL 被系统“杀死”了!
关键词:OOM Killer、MySQL 被杀、内存不足、PHP-FPM 优化、Swap 配置、LEMP 服务器调优
适用场景:1.8G 小内存云服务器运行 WordPress + Nginx + MySQL
作者:[您的名字/ID]
发布时间:2026年3月
💥 问题现象:网站突然打不开,数据库“神秘消失”
最近我的个人 WordPress 网站频繁出现“数据库连接错误”,刷新几次后又能恢复。查看服务状态,发现 MySQL 服务莫名其妙地停止了:
[root@king ~]# systemctl status mysqld
● mysqld.service - MySQL Server
Active: failed (Result: signal) since Wed 2026-03-18 15:13:57 CST; 9min ago
Process: 421445 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=killed, signal=KILL)
最关键的一行是:
code=killed, signal=KILL
这说明 MySQL 不是自己崩了,而是被操作系统强制“处决”了!
🔍 根本原因:内存耗尽,触发 OOM Killer
在 Linux 系统中,当物理内存 + Swap 全部用完时,内核会启动 OOM Killer(Out-Of-Memory Killer),自动选择一个“最该死”的进程干掉,以保全系统不崩溃。
第一步:确认是 OOM 杀的
执行以下命令查看内核日志:
dmesg -T | grep -i "killed process"
输出如下(节选):
[Wed Mar 18 15:03:50 2026] Out of memory: Killed process 417465 (mysqld)
[Wed Mar 18 15:03:52 2026] Out of memory: Killed process 417537 (mysqld)
...
✅ 铁证如山!MySQL 正是因为内存不足被系统杀死的。
第二步:检查服务器资源
free -h
故障前状态:
total used free shared buff/cache available
Mem: 1.8Gi 1.7Gi 128Mi 2.0Mi 176Mi 162Mi
Swap: 0B 0B 0B ← 没有 Swap!
- 总内存仅 1.8GB
- 可用内存仅 162MB
- Swap 为 0 —— 这是致命缺陷!
💡 结论:小内存服务器 + 无 Swap + 默认高配的 MySQL/PHP = 必然被 OOM Killer 干掉。
🛠️ 解决方案:三步彻底根治
✅ 第一步:紧急加装 Swap(安全气囊)
Swap 是内存的“后备军”,即使慢一点,也比服务崩溃强!
# 创建 2GB Swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
✅ 效果:系统有了缓冲空间,不再“走投无路”。
✅ 第二步:大幅精简 MySQL 配置(/etc/my.cnf)
默认配置对 1.8G 内存来说太奢侈!关键修改如下:
[mysqld]
innodb_buffer_pool_size = 512M # 从默认1G+降到512M
max_connections = 30 # 限制并发
sort_buffer_size = 256K # 所有连接级缓冲区设小
read_buffer_size = 256K
join_buffer_size = 256K
performance_schema = off # 关闭监控省100MB+
skip-name-resolve # 加快速度
📌 原则:总内存占用 < 800MB,给 OS 和 PHP 留足空间。
✅ 第三步:严格限制 PHP-FPM 进程数(/etc/php-fpm.d/www.conf)
WordPress 是内存大户,PHP-FPM 默认允许 50 个进程,每个吃 100MB+,直接爆炸!
pm = static # 改为静态模式,精确控制
pm.max_children = 8 # 从50降到8!
php_admin_value[memory_limit] = 128M
request_terminate_timeout = 30s # 防止卡死
⚠️ 重点:
pm.max_children = 8是稳定运行的关键!
📊 优化前后对比(效果惊人!)
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 可用内存 | 162MB | 1.3GB |
| Swap 使用 | 0B | 42MB(几乎未用) |
| MySQL 状态 | 频繁被杀 | 稳定运行 |
| 网站可用性 | 经常502/503 | 持续在线 |
# 优化后内存状态
[root@king ~]# free -h
total used free shared buff/cache available
Mem: 1.8Gi 555Mi 1.1Gi 1.0Mi 322Mi 1.3Gi
Swap: 2.0Gi 42Mi 2.0Gi
✅ 内存压力解除,系统重回健康状态!
📌 经验总结 & 建议
- 小内存服务器必须配 Swap!哪怕只有 2GB,也能救命。
- 不要相信默认配置!MySQL 和 PHP-FPM 的默认值适合大内存服务器,小机器必须手动“节食”。
- 监控是关键:定期用
free -h、htop查看资源,早发现早处理。 - 长远之计:如果网站流量增长,升级到 4GB 内存是最稳妥的方案。
结语:技术运维不仅是“让服务跑起来”,更是“让服务稳如泰山”。一次 OOM 故障,背后是资源规划、配置调优和系统理解的综合考验。希望本文能帮到同样在小服务器上挣扎的你!
0 条评论