🚨 故障复盘:WordPress 网站频繁崩溃?原来是 MySQL 被系统“杀死”了!

Published by heqiubing on


关键词: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 是稳定运行的关键!


📊 优化前后对比(效果惊人!)

指标优化前优化后
可用内存162MB1.3GB
Swap 使用0B42MB(几乎未用)
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

内存压力解除,系统重回健康状态!


📌 经验总结 & 建议

  1. 小内存服务器必须配 Swap!哪怕只有 2GB,也能救命。
  2. 不要相信默认配置!MySQL 和 PHP-FPM 的默认值适合大内存服务器,小机器必须手动“节食”。
  3. 监控是关键:定期用 free -hhtop 查看资源,早发现早处理。
  4. 长远之计:如果网站流量增长,升级到 4GB 内存是最稳妥的方案

结语:技术运维不仅是“让服务跑起来”,更是“让服务稳如泰山”。一次 OOM 故障,背后是资源规划、配置调优和系统理解的综合考验。希望本文能帮到同样在小服务器上挣扎的你!


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注