小内存服务器跑宝塔经常高负载?排查思路与参数优化备忘

核心导读:记录在 1G 到 4G 内存轻量服务器上运行宝塔面板时的优化调校经验,包含 PHP 进程数控制、Swap 交换分区配置与 MySQL 关键参数,备忘以供日后查阅。

最近在帮朋友维护一台 2G 内存的云服务器,上面挂了两个 WordPress 站点。前阵子访客稍微多一点,或者后台跑定时任务时,Nginx 就会频繁报 502 Bad Gateway,进去看 CPU 经常跑满,MySQL 也隔三差五被系统 OOM 杀掉。

花了大半天时间排查,把几个导致资源耗尽的瓶颈重新理了理。这里把排查逻辑和目前跑得比较平稳的一套参数顺手记录下来,省得下次换机器又得重头翻文档。

1. 临时恢复与紧急处置

如果服务器已经卡死或者服务挂了,第一步不是盲目改配置,而是先把业务拉起来并释放内存:

bash
# 查看当前内存占用排名靠前的进程 top -c -b -n 1 | head -n 20 # 检查系统内核是否触发了 OOM 杀进程 dmesg -T | grep -E -i -B 2 -A 5 '(killed process|oom-killer)'

常见情况是 php-fpm 派生子进程过多,或者 mysqld 申请内存超标,被系统直接杀掉。如果是 MySQL 挂了,先重启服务,然后清理系统缓存应急:

bash
sync && echo 3 > /proc/sys/vm/drop_caches

2. 关键参数设置参考

宝塔默认安装环境为了兼容性,很多参数给得偏保守甚至偏宽泛。小内存机器一定要人工收紧 php-fpm 的进程数,并合理分配 MySQL 缓冲池大小,同时必须开启虚拟内存垫底。

下面是我在不同配置机器上测试较为稳定的参数组合:

服务器配置Swap 建议大小PHP max_children (动态模式)MySQL innodb_buffer_pool_size
1 核 1G 内存1536M - 2048M5 - 8128M

| 2 核 2G 内存 | 2048M - 4096M | 15 - 25 | 256M - 512M |
| 2 核 4G 内存 | 4096M | 30 - 50 | 1024M |

几个注意事项:

  • PHP 的 pm.max_children:一个标准的 PHP 7/8 进程在跑 WordPress 等动态内容时,平均占用 30M 到 60M 内存。如果是 2G 内存的机器,除去系统底层和 MySQL,留给 PHP 的安全内存也就 800M 左右,如果开 50 个进程,高峰期必崩。
  • Swap 交换分区:很多轻量云主机默认不带 Swap,一旦物理内存耗尽直接杀进程。哪怕用 SSD 跑 Swap 性能稍慢,也远好过服务直接中断。直接在宝塔的“Linux工具箱”里设置 2G~4G 即可。
  • MySQL 配置:在宝塔的 MySQL 管理界面里,直接选择对应的内存预设模板,通常选择 1G~2G 的预设比默认大内存配置稳健得多。

3. 查看日志确认具体原因

很多时候机器负载飙升不是真实访客造成的,而是被爬虫扫爆或者遭到了异常请求刷接口。改完基础参数后,必须看日志确认流量类型:

  1. 查看 Nginx 访问日志中的高频 IP
bash
tail -n 10000 /www/wwwlogs/your_site.log | awk '{print $1}' | sort | uniq -c | sort -nr | head -n 10
如果发现单个 IP 短时间内请求几千次,绝大多数是恶意采集、漏洞扫描或暴力破解,直接在防火墙里封禁即可。
  1. 观察 PHP 慢日志(Slow Log)
在 PHP 设置里开启 request_slowlog_timeout = 3s,如果有特定插件或 SQL 查询卡住几秒以上,日志里能清清楚楚看到卡在哪一行代码。

4. 为什么改完参数后还是会被打崩?

有时候即使参数调到最紧凑,CPU 和负载依然居高不下,这通常有两类诱因:

第一是搜索引擎或恶意蜘蛛的高并发抓取。像某些无节制的海外垃圾爬虫,单日抓取几十万次动态页面,小机器根本吃不消。解决办法是在 Nginx 配置中增加 limit_req 模块限制单 IP 访问频率,或者配合站长管理工具、防火墙规则过滤掉伪造爬虫。

第二是缺乏应用层缓存。纯动态查询对数据库压力极大,如果是 WordPress 站点,尽量开启 Redis 缓存或 WP Super Cache 这类页面级静态化插件。静态 HTML 页面直接由 Nginx 吐出,几乎不消耗 PHP 和数据库资源。

如果站点日常流量较大或者经常有小规模撞库攻击,手动分析日志会比较费精力,也可以考虑利用宝塔自带的 Nginx WAF 防火墙模块或者网站监控报表插件,直观抓出异常请求和高频攻击源,排查效率会高不少。

常见问题与解答 (FAQ)

Q 小内存机器开启 Swap 虚拟内存会不会严重拖慢磁盘寿命或读写性能?

Swap 主要是充当安全气囊,防止物理内存耗尽时核心进程被系统强行杀掉;在正常低负载下系统优先使用物理内存,对云盘寿命和性能的影响微乎其微。

Q 在宝塔后台修改完 PHP 或 MySQL 参数后,需要手动重启服务器吗?

不需要重启整台服务器,只需要在宝塔面板对应软件的管理界面中点击“重载配置”或“重启”即可让新参数生效。

返回运维知识库