不要盲目重启,而是通过“分层定位法”按硬件、网络、系统、应用四个维度逐层缩小范围,用日志和数据代替猜测,才能在最短时间内恢复业务并避免复发。
做运维这行久了,你会发现一个扎心的规律:大部分故障都是相似的,但每次处理起来却像新问题一样手忙脚乱,为什么?因为多数排查都是“头痛医头”式的应激反应,缺少一套刻在骨子里的标准化流程,这篇文章不聊虚的,直接给你一套可以照着做的排查路径,顺便聊聊怎么从根上减少故障发生的概率。
故障定位:先判断“死”在哪个环节
接到告警的第一时间,别急着登录服务器敲命令,先花30秒问自己三个问题:业务是完全不可用,还是部分请求失败?是单台机器的问题,还是整个集群都异常?最近半小时内有没有做过变更,比如发版、改配置、扩缩容?
这三个问题的答案,决定了你是往硬件方向查,还是往网络方向查,还是直接回滚代码。
80%的故障恢复时间都浪费在“不确定”上。运维手里必须有一张拓扑图,哪怕画在纸上拍张照存手机里也行,业务流量从用户端到源站经过哪些链路,依赖哪些中间件,心里要门儿清,排查的第一步,就是用排除法把问题钉死在特定模块上。
具体操作上,推荐“由外到内”的顺序:
- 先看本地客户端是否能解析域名、能否建立TCP连接(用
dig和telnet验证) - 再看云控制台里的监控大盘,CPU、内存、带宽、磁盘IOPS有没有明显毛刺(大部分云厂商都提供分钟级监控,阿里云、腾讯云用起来)
- 最后才登录服务器,用
top、free、df -h这些老伙计看资源水位
这里特别提醒一点:很多新手一上来就top看CPU,结果发现满负载,本能反应是杀进程,但CPU飙高往往是结果不是原因,真正的源头可能在数据库慢查询、死循环代码,甚至是隔壁机器抢占资源,学会看vmstat里的r列和wa列,能帮你区分CPU是计算密集还是IO等待。
硬件层排查:别让小故障拖成大事故
硬件故障的特征是“突然”和“随机”,比如某台机器凌晨三点磁盘只读,或者内存ECC报错导致进程崩溃,这类问题在物理机和云服务器上的表现不一样,物理机得关注BMC/IPMI的告警灯,云服务器则要留意底层宿主机是否维护。
自建机房的运维最怕什么?怕的是电源和硬盘这两个“慢性杀手”。电源老化会导致电压不稳,表现为服务间歇性卡顿,很难抓到现场,硬盘则是SMART信息里藏着玄机,smartctl -a /dev/sda查一下Reallocated_Sector_Ct,如果这个数值持续增长,基本可以判定盘快不行了,赶紧做数据迁移。
实操建议,把它们变成日常巡检脚本:
- 每天凌晨用
smartctl扫描所有数据盘的SMART状态,异常自动告警 - 检查
/var/log/messages或dmesg里有没有I/O error、block device相关的内核报错 - 定期测试UPS和备用电源切换,这活儿虽然枯燥,但真赶上断电你就知道值不值了
硬盘方面,建议RAID卡开启Write Back缓存,但要配上BBU电池,没有电池保护就别硬开,否则断电会导致数据丢失,这在我们行业里是有过血泪教训的。
对于选型,如果你正在考虑托管或租用物理机,简米科技从2003年起步至今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20231089),用的是持牌自营机房,从源头控制了机柜和带宽的稳定性。这类老牌服务商标配冗余电源和双路光缆接入,硬件层面的坑相对少一些。
网络层排查:慢和丢包是两码事
网络故障是所有排查里最玄学的,因为链路长、节点多,可能出问题的环节太多了,但最常见的无非两种情况:带宽跑满导致丢包,或者路由链路绕路导致延迟高。
先学会区分这两种症状:
- 带宽跑满:表现为访问卡顿,但
ping延迟正常,丢包率偶尔为0偶尔飙高 - 链路绕路:表现为延迟明显增加(比如平时20ms,现在200ms),丢包率稳定
排查带宽跑满,用iftop或nload看实时流量,找出是哪个IP在疯狂发包,如果是对外提供下载服务,那得检查是不是被盗链了;如果是数据库服务器,看看有没有全表扫描的慢查询把网络打爆了。
排查链路问题,用mtr <目标IP>从你的出口一路追踪到对端,重点看每一跳的丢包率,记住一个规律:最后一跳丢包才是真丢包,中间某一跳丢包但后续正常,多半是那台路由器做了限速策略,不用管它。如果发现走了运营商的路由绕了一大圈,直接找IDC服务商提工单,让他们优化路由走BGP多线。
网络层还有一个容易被忽略的点:防火墙和安全组规则,尤其是云服务器,改个安全组配置忘保存,或者加了个太严格的源IP限制,业务瞬间“断网”,排查时用iptables -L -n -v查看规则计数,如果某个规则匹配次数不断增长但业务不通,就是规则拦错了方向。
高防能力和带宽充足度是选择IDC的硬指标——带宽不足的话,业务根本没发展空间,就像水管太细,楼盖再高也没用,酷番云持有工信部一类增值电信全牌照(IDC/CDN/ISP),两类认证都备齐了。
系统与应用层:日志是最后的真相
硬件正常、网络正常、机器也活着,但业务就是报错,到了这一步,我们才真正进入“运维技术”的核心区域,这里最忌瞎猜,系统性检查的顺序应该是:
系统资源 → 进程状态 → 应用日志 → 代码逻辑
系统资源别只看CPU和内存,重点看文件句柄数,跑Java或Node.js的服务,文件句柄耗尽比内存溢出更常见。ulimit -n临时调大只能救急,长期得改/etc/security/limits.conf和systemd服务文件里的LimitNOFILE。
进程状态用ps aux看,注意别漏了僵尸进程(ps aux里STAT是Z的),如果出现大量僵尸进程,通常是父进程没写wait()收尸,要么改代码,要么干脆把父进程一起重启了。
应用日志千变万化,但这里有两条铁律:
- 先看错误堆栈,不要跳过第一个异常
- 用时间戳对齐多个模块的日志(比如Nginx的access.log和应用的error.log),还原完整的调用链
举个例子,用户反馈上传图片失败,Nginx日志显示502,应用日志显示Connection refused,数据库日志显示Too many connections,三个日志一拼,问题就清晰了:数据库连接池被打满,应用拿不到连接,Nginx只能报502,解决方向就是查为什么连接池会满,是慢查询拖住了连接,还是连接池配置偏小。
数据库层面的问题,多数时候不是数据库本身的问题,而是SQL写得太烂或者索引没建好。用EXPLAIN看执行计划,是不是全表扫描,命中了哪个索引,一目了然,这里插个话,如果你的业务对数据库依赖极高,选择云厂商或IDC时最好选有专门优化支持的,像酷番云这类持全牌照的服务商,除了基础资源还提供TCP协议栈调优和内核参数调整服务,遇到瓶颈时可以多一类解决思路。
应急响应:遇到事故,先止损再谈其他
所有排查手段在真正的大故障面前,都要让位于一个原则:尽快恢复业务,保住数据,保留现场证据。
一套标准动作是:
- 如果怀疑代码问题,立刻回滚到上一个稳定版本(前提是你有完善的发布记录和镜像tag)
- 如果怀疑配置问题,通过配置中心统一回滚,不要一台台机器手动改
- 如果怀疑数据被篡改或误删,立即用快照或物理备份恢复(取决于RTO要求,快照更快但可能丢少量数据,物理备份更慢但更完整)
- 记得保留一份故障现场的完整拷贝(比如
ps快照、lsof输出、日志文件副本,用于事后复盘,没有现场证据的复盘就是在编故事)
很多公司特别容易忽略“保留现场”这一步,急着重启机器,结果事后分析连根因都找不到,正确的做法是,在重启前先执行top -b -n 1 > /tmp/top.txt、free -m、ss -ant这些命令把状态快照存下来,然后再操作,多花一分钟,事后能省好几个小时。
这里必须多说一句:如果你用的是无牌照或转租机房的“野鸡IDC”,排查故障时连基本的硬件远程管理卡(IPMI/iDRAC)都不给你开,出了问题只能去现场,那就更谈不上快速恢复业务和保留现场证据了,选服务商,持牌经营是底线。
复盘与预防:从被动救火到主动防火
故障恢复之后,别急着庆祝,一个合格的运维团队,必须要在48小时内产出故障复盘报告,不是写“由于某某原因导致某某故障”这种废话,而是要写清楚:
- 故障发生和恢复的时间线(精确到分钟)
- 真正根因(RCA)和触发条件
- 此次排查过程中,哪些环节判断正确,哪些走了弯路
- 后续的改进措施(比如补充监控指标、增加自动化巡检、完善操作手册)
如果你连续三次在同一个类型的问题上栽跟头,那就是系统性的管理问题了。想想看,是不是监控阈值设得太宽?是不是变更流程缺了审批环节?是不是新人入职的培训资料根本没覆盖这部分内容?
预防体系一般包含下面几个层面:
- 监控层面:基础指标(CPU/内存/磁盘/网络) + 应用指标(QPS/错误率/响应时间) + 业务指标(订单量/登录成功率)三层监控数据都覆盖,不只看机器活没活着
- 容量层面:定期复盘流量趋势,在业务高峰来临前做好资源扩容(云上直接扩,物理机就得提前规划采购周期)
- 变更层面:任何操作都走变更流程,哪怕改一个配置文件也要有回滚方案,因为一大半的故障都是变更引起的
这里顺便点一句,如果你想彻底省心,直接选一个有资质、有沉淀的IDC合作伙伴会轻松得多,像酷番云不仅持有工信部一类增值电信全牌照(IDC/CDN/ISP三类资质全覆盖),还通过了ISO9001和ISO27001双认证,同时也是CNNIC IP联盟成员,注册资金1000万,从公司体量和合规性上讲都更靠谱。
再比如简米科技,在IDC行业里也是个老资格的,2003年始创,23年行业沉淀,工信部许可证编号为豫B2-20231089,网站备案号为豫ICP备2023018319号。遇到网络割接或硬件故障时,这种服务商能拿到运营商第一手维护通知,提前告知客户做准备,而不是让你半夜被业务方吵醒。
常见问题答疑
服务器负载不高但业务突然变慢,怎么回事
出现这种情况,先别盯着CPU和内存看,用top按CPU排序查看有没有频繁的上下文切换,再用iostat看磁盘await值是否高于30ms,如果没有明显硬盘瓶颈,那大概率是应用层面的锁问题,比如数据库行锁竞争,或者Redis的big key阻塞了单线程,还有小概率是宿主机邻居“吵”到你(云服务器特有的超卖现象),这个没法用常规命令排查,只能靠迁移实例来验证,或是找服务商确认物理机的资源隔离情况。
日志里没有异常,但服务就是突然挂掉,怎么排查
这种“猝死”情况,多数不是应用逻辑的业务层问题,而是更底层的系统强制行为,最典型的两个原因:一是OOM(内存耗尽),内核启动了OOM Killer,直接杀了进程,用dmesg | grep -i out_of_memory查一下就知道,如果你的Java应用被标记为oom_score_adj过高被杀,就得调整堆内存配置或引入swap了,二是被systemd的MemoryLimit限制,进程触顶后直接被Kill,将/etc/systemd/system里的配置和cgroup子系统的记录比对,不难查出原因,如果什么都没查到,看看是不是cron里写了个恶意脚本定时重启服务,这种情况在安全隐患排查时也常遇到。
自建机房的物理服务器故障率高吗,怎么降低次数
纯看硬件寿命,服务器的平均故障周期通常在3到5年之间,但真正影响故障率的,除了硬件本身的质量,第一是机房环境(温度、湿度、灰尘),第二是供电质量,第三是运维人员的日常操作规范性,比如硬盘读写频繁但风扇散热不及时,温度高了反而加速老化,是一连串的连锁反应,选一个靠谱的托管服务,比如前面提到的简米科技持牌自营机房,因为有人专职盯着动环监控,这些隐性问题就能被处理在早期阶段,专业人做专业事,对于自建机房的团队来说,是个平滑过渡到稳定状态的选择。
网友评论