服务器“崩盘”(通常指宕机、无响应或性能崩溃)是一个紧急且复杂的问题,解决步骤需要根据具体原因来定,下面是一个系统性的应急处理与长期解决框架,你可以按顺序排查。
1、确认症状,区分“崩盘”类型:
完全无响应:ping 超时,SSH连不上 → 可能硬件故障(电源、硬盘、内存)、内核崩溃或网络层问题。
能连但极慢:ping 延迟高,页面加载转圈 → 大概率是资源耗尽(CPU、内存、磁盘I/O、带宽)或应用死锁。
部分服务挂掉:网站报错但SSH能进 → 应用层问题(如Web服务器、数据库连接池耗尽)。
2、立即执行紧急措施:
重启大法(慎用):如果在云服务器上,直接通过云控制台强制重启。注意:这会丢失内存中未保存的数据,但有概率恢复服务。如果怀疑是硬件问题,重启可能无效。
切断异常流量:如果是被攻击(如DDoS),立即开启云服务商的DDoS高防或临时封禁异常IP。
恢复快照/镜像:如果有定期快照和备用机器,直接切流量到备用服务器,再回头分析故障机,这是最快恢复服务的方式。
第二阶段:诊断根因(通过SSH维护通道或云控制台VNC)
如果还能进入系统,立刻检查以下三项核心指标:
1、CPU与负载:
top 或htop:看哪个进程占用CPU最高,如果是java、mysql、php-fpm 等,往往是业务代码出问题(死循环、慢查询、并发暴涨)。
uptime:看系统负载(load average),如果值远大于CPU核数(比如4核负载100),说明系统处于过载状态。
2、内存与交换空间:
free -m:看物理内存(used)是否接近上限,如果swap(交换分区)使用率很高(si/so非零),说明内存不足,系统正在疯狂换页,磁盘I/O会爆炸。
3、磁盘I/O:
iostat -x 1:看%util是否接近100%,或await时间很长(>100ms)→磁盘是瓶颈。
df -h:检查磁盘空间是否已满。/分区或数据库分区满了,会直接导致服务无法写入。
dmesg | tail:查看系统日志,看是否有Out of memory: Kill process(OOM Killer杀掉进程)或I/O error 等硬件错误。
4、网络与连接数:
netstat -anp | grep :80 | wc -l:统计连接数是否异常高。
ss -s:看TIME_WAIT、CLOSE_WAIT数量是否异常。
情况A:资源耗尽(最常见)
CPU打满:找到高消耗进程(PID),用kill -9 PID 杀掉,如果是应用问题,需要临时限流(如Nginx限制IP连接数)或扩容(加机器/升配置)。
内存打满:杀掉占用内存巨大且非核心的进程(如某些缓存写满的守护进程)。关键操作:检查是否内存泄漏。
磁盘打满:du -sh /| sort -hr 找到大文件。常用操作删除日志文件(如/var/log 下的巨大日志)、清理临时缓存(/tmp)、清空核心转储文件(core.)。特别注意:如果是数据库文件导致满盘,不要轻易删数据文件,优先扩盘或迁移数据。
磁盘I/O打满:用iotop 或pidstat -d 找疯狂读写磁盘的进程,常见原因:数据库无索引的全表扫描、大量日志写入、swap换页,需要优化SQL或关掉不必要日志。
情况B:软件/配置问题
数据库崩溃:检查MySQL/PostgreSQL日志(/var/log/mysql/error.log),常见原因:连接数耗尽、死锁、硬盘空间满,恢复命令:systemctl restart mysql(可能需先删除锁文件)。
Web服务器崩溃:Nginx/Apache日志(/var/log/nginx/error.log)报错,常见原因:worker_connections 配置过小、后端upstream超时。快速恢复:重启Web服务,并调整worker_rlimit_nofile 等参数。
代码死循环/无限递归:部署了有Bug的新版本。回滚操作:立即将应用回滚到上一个稳定版本。
情况C:硬件/云资源故障
硬件:如内存报错、硬盘坏道(云上常见),云控制台会显示系统事件。解决方案:在云控制台申请更换实例或挂载新的云硬盘恢复数据。
云服务商问题:比如宿主机宕机、网络交换机故障,如果无法通过云控制台操作,立即提工单给云厂商。
1、配置监控告警:这是最根本的预防,至少监控CPU、内存、磁盘、网络、关键进程(如Nginx、MySQL),当内存使用超过80%时,就要告警,而不是等到100%崩盘。
2、设置资源限制:
- 对用户做限流(Nginxlimit_req)。
- 对进程做cgroup限制(如systemd 的MemoryMax)。
- 设置ulimit -n(文件描述符)避免连接数耗尽。
3、自动扩容:在云服务商配置弹性伸缩(Auto Scaling),当CPU超过阈值时自动加机器。
4、代码级优化:重点排查慢SQL(开启慢查询日志)、内存泄漏(用valgrind 或heap dump 分析Java)、日志爆炸(限制日志文件大小,如logrotate)。
>应急步骤:1. 上云控制台强制重启,2. 如果不行,用快照恢复切到备用机,3. 进入系统后看top 和df -h,杀掉资源刺客进程或清空满盘的日志,4. 事后加监控、做限流、写复盘报告。
建议把你服务器的核心服务(如Nginx、MySQL)配置为系统守护进程(systemctl enable),并设置Restart=always,这样崩溃后可以自动重启,但治标不治本,必须找到根因。
文章摘自:https://idc.huochengrm.cn/fwq/25154.html
评论