服务器频繁宕机故障排查修复:零基础手把手教程
服务器频繁宕机很让人头疼,网站打不开、业务中断,直接损失用户和收入。
遇到这种情况别慌,按下面的步骤从零开始排查,大多数问题都能自己搞定。
先做两件准备工作
第一,确保你能远程登录服务器。如果是阿里云、腾讯云之类的云服务器,先在控制台重启(强制重启也行),让服务器临时恢复,然后马上通过 SSH 连接。不知道 SSH 的可以用宝塔面板的“终端”功能,或者用 XShell、Putty 这类工具。
第二,登录后第一时间做快照或备份。万一操作失误导致系统崩溃,还能回滚。云厂商控制台都有“创建快照”按钮,点一下不费事,但能救急。
第一步:用几条命令摸清服务器状态
连接上服务器后,依次执行下面几条命令,看看系统资源是不是已经见底。
检查内存是否爆满
free -h
输出重点关注“可用(available)”那一列。
如果可用内存低于 500MB,甚至显示为 0,说明内存不足很容易触发 OOM(Out of Memory)进程被杀,导致服务宕机。
查看 CPU 负载是否过高
top -bn1 | head -20
看第 1 行的“load average”后面三个数字,分别代表 1、5、15 分钟的平均负载。
如果三个数都超过了 CPU 核心数(比如 4 核服务器负载高于 4),说明 CPU 忙不过来,可能跑了什么吃资源的进程。
在 top 界面按 1 可以看到每个核心的使用率。
检查磁盘空间是否写满
df -h
主要看根分区(/)的使用率,如果超过 90%,系统日志或临时文件可能把空间撑爆,导致数据库无法写入、服务异常。
继续用 du -sh /var/log/ 看看日志目录是不是特别大。
第二步:查看系统日志找出异常线索
日志是宕机最直接的“黑匣子”。
查看最后的系统日志
journalctl -xe --no-pager | tail -50
这是 CentOS 7 / Ubuntu 16.04 以上系统最常用的命令。
输出会告诉你系统在宕机前发生了什么错误,比如内存耗尽、文件系统错误、内核 panic。
检查 dmesg 信息
dmesg | tail -30
dmesg 输出的是内核日志,很多硬件或内存问题会在这里显示。
如果看到“Out of memory: Kill process”这类字眼,那就是内存爆了;
看到“I/O error”可能是硬盘故障。
查看更早的日志文件
如果服务器已经重启过,journalctl 只能看到重启后的日志。
想查重启前的情况,看 /var/log/messages(CentOS)或 /var/log/syslog(Ubuntu):
sudo tail -200 /var/log/messages
找到 crash 时间点附近的记录,分析报错。
第三步:定位常见原因并动手修复
根据上面检查的结果,对症处理。
下面列出三种最常见的宕机原因和修复方法。
原因一:内存不足
症状:free -h 显示可用内存极低,dmesg 有“Kill process”字样。
修复方法:
- 临时方案:关闭一些不常用的服务,比如
systemctl stop nginx先释放内存,然后考虑升级服务器内存。 - 长期方案:检查是否有内存泄漏。运行
top按M键按内存排序,看看哪个进程占用最高。例如 Java 应用容易出现内存溢出,可以调整 JVM 参数 Xmx。 - 如果安装了 MySQL,可以适当调低
innodb_buffer_pool_size释放部分内存。
原因二:磁盘空间写满
症状:df -h 显示使用率接近 100%,服务报“No space left on device”。
修复方法:
- 先清理日志。日志文件多在
/var/log/下,找到最大的文件(比如journal日志累积了几十 GB),执行sudo journalctl --vacuum-size=200M清理到 200MB。 - 清空废弃的临时文件:
sudo rm -rf /tmp/*(谨慎,确保没有重要数据)。 - 卸载不用的软件包:
sudo apt autoremove(Ubuntu)或sudo yum autoremove(CentOS)。 - 定期设置日志轮转,修改
/etc/logrotate.conf配置保留天数。
原因三:CPU 被恶意进程或异常脚本占满
症状:top 看到某个进程 CPU 使用率长期 100%,负载高。
修复方法:
- 用
ps aux --sort=-%cpu | head -10找出吃 CPU 的进程。如果是挖矿木马(常见文件名如 xmrig、kthrotlds),直接 kill 掉,然后检查 crontab(crontab -l)删除异常任务。 - 安装 fail2ban 或更换复杂密码防止被暴力入侵。
- 如果是正常业务导致负载高,考虑升级 CPU 或优化程序代码。
避坑指南:新手最容易踩的坑
- 盲目重启不查根因:重启后服务器短暂恢复,但根本问题没解决,过几天还会宕。一定要先查日志再决定。
- 误删关键日志文件:不要直接
rm /var/log/messages,会导致服务写日志出错。建议用truncate -s 0清空内容而不是删文件。 - 忘记检查 swap 分区:内存不够时 swap 能顶一阵,但 swap 使用率高意味着内存严重不足。执行
swapon -s查看 swap 使用量,如果很高,赶紧加内存。 - 忽略硬件告警:如果日志里出现“Hardware Error”、“EDAC”、”ATA bus error”,很可能物理硬件(内存条、硬盘)坏了,这种只能联系机房或云厂商更换。
效果验证:怎么知道问题解决了?
修复后不要急着下线,观察一段时间。
- 执行
uptime看服务器运行了多久,至少坚持运行 24 小时以上才算稳定。 - 再用
free -h、df -h、top确认资源在正常范围内(内存可用>1GB,磁盘使用率<80%,CPU 空闲>20%)。 - 查看日志是否有新的错误:
journalctl -p err -b显示本次启动后的错误信息,数量应很少。 - 对于 web 服务,访问网站测试几次,确认响应正常。
如果你按照上面的步骤走了一遍,还是没有找到原因,可能需要检查硬件(运行 memtest 测内存,用 smartctl 看硬盘健康)或联系专业运维。
但绝大多数服务器频繁宕机故障,都是资源或日志里暴露出来的常见问题,自己动手完全能解决。
遇到异常时优先回看避坑和高频问题部分,能省下很多走弯路的时间。