服务器内存爆满怎么办?从排查到解决一步到位
服务器内存爆满是新手站长最常遇到的故障之一。
网站打开缓慢、SSH操作卡顿、甚至直接宕机,往往都和内存耗尽有关。
本文按零基础也能直接执行的方式,帮你一步步解决问题。
先确认服务器到底是不是“爆满”
不要凭感觉判断。
登录服务器后,第一件事就是查看内存真实占用。
执行下面这条命令:
free -h
关注 available 和 used 两列。
如果 available 接近 0 或只有几十 MB,说明内存确实紧张。
另外注意 swap 的使用情况:如果 swap 也被大量占用,那说明物理内存早就撑不住了。
如果 free -h 显示的 used 很高,但 available 还有不少,那可能是 buffers/cache 占用的内存(Linux 会把空闲内存用作缓存)。
这时候不一定需要立即清理,先往下继续排查。
找到“吃内存”的进程
检查内存占用的主力工具是 top。
直接输入:
top -o %MEM
这个命令会按内存使用率从高到低排序,最上面几个就是“罪魁祸首”。
常见的吃内存进程有:
- MySQL / MariaDB:数据库程序,配置不当或查询量大会疯狂吃内存。
- PHP-FPM:PHP 进程消耗,特别是配置了过多子进程。
- Nginx / Apache:Web 服务器处理大量并发时也会占用较多内存。
- Java 应用:如 Tomcat、Java 微服务,默认堆内存分配很高。
如果你不想用 top,也可以用 ps aux --sort=-%mem | head -10 只看前 10 名,输出更简洁。
临时释放内存:重启服务或清理缓存
方案一:重启占用高的服务
如果确认是某个服务(比如 MySQL)占用过高,且当前业务允许重启,可以直接重启该服务:
systemctl restart mysql
或者通过宝塔面板,在软件商店找到对应服务点击“重启”。
重启后,该服务占用的内存会重新分配,往往能释放大量内存。
方案二:清除系统缓存(不推荐频繁使用)
Linux 缓存数据可以用这个命令清理:
sync && echo 3 > /proc/sys/vm/drop_caches
它会把 pagecache、dentries 和 inodes 缓存都清掉。
注意:这只是临时腾出可用内存,不会杀死任何进程。
如果进程本身还在不断申请内存,很快又会爆满。
所以建议只在你需要临时腾内存来执行某个紧急操作时使用。
方案三:杀掉僵尸或异常进程
如果 top 里看到某个进程占用异常高,而且不是你的业务进程(比如挖矿病毒、垃圾爬虫),可以用 kill 杀掉:
kill -9
PID 就是进程号,从 top 或 ps 里可以看到。
杀之前最好确认一下进程名,别误杀了系统核心进程。
从根本上解决:优化配置或升级内存
临时手段只能救急,如果频繁出现内存爆满,必须从根源上下手。
1. 调整 MySQL 配置
打开 MySQL 配置文件(通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf),找到 innodb_buffer_pool_size 参数。
这个参数决定 MySQL 使用多少内存做缓存。
对于 1GB 内存的服务器,建议设置为 200~300MB;
如果是 2GB 内存,可以设到 500~700MB。
修改后重启 MySQL 生效。
2. 优化 PHP-FPM 进程数
PHP-FPM 的配置通常在 /etc/php-fpm.d/www.conf 或 /etc/php/7.4/fpm/pool.d/www.conf。
重点调整 pm.max_children 和 pm.start_servers。
先算一下:你的 PHP 进程平均占用多少内存(通过 top 观察),然后预留一定空间给系统和其他服务。
例如每个 PHP 进程占 30MB,总内存 1GB,保留 300MB 给系统,剩下 700MB 最多开 23 个进程。
3. 添加 Swap 虚拟内存(临时方案)
如果物理内存真的不够用,可以增加 Swap 作为缓冲。
创建一个 2GB 的 Swap 文件:
dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
为了让开机自动挂载,要写入 /etc/fstab:
echo '/swapfile none swap sw 0 0' >> /etc/fstab
不过 Swap 性能远低于物理内存,只是用来防止 OOM 杀进程而已。
避坑指南:新手常犯的错误
- 别一上来就
free -m看 used 很高就以为内存爆满。Linux 会把空闲内存拿去做 cache,这不算真正的占用。重点看available。 - 不要频繁执行
drop_caches,这会影响磁盘 I/O 性能。 - 不要随意
kill -9系统进程(如 systemd、sshd),可能导致服务器脱管。 - 不要在不检查进程的情况下直接重启服务器,重启后问题可能依旧,而且丢失未保存的数据。
效果验证
做完上述操作后,再次运行 free -h 查看内存变化。available 应该明显增大。
用 top -o %MEM 确认之前的“大内存”进程是否恢复正常。
如果业务访问正常,网页打开流畅,说明问题已解决。
常见问题解答
Q:清理完缓存后,内存很快就满了怎么办?
A:说明有进程一直在消耗内存,需要按第二步定位具体进程并处理。
Q:我使用的是宝塔面板,有没有更简单的方法?
A:宝塔面板首页有一个“资源监控”图表,可以直观看到内存走势。在“软件商店”里可以重启服务,在“计划任务”里可以设置定时释放内存脚本(但不推荐依赖自动释放)。
如果你正在处理服务器内存爆满,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。