天翼测评网天翼测评网天翼测评网

欢迎光临
我们一直在努力

服务器无响应排查:间歇性无响应别只重启,查系统日志与硬件

机房里的服务器又“卡死”了,业务告警一条接一条,你熟练地敲下reboot,几分钟后一切恢复正常。但没过多久,同样的间歇性无响应再次出现。重启确实能解决一时之痛,却掩盖了真正的病根。今天咱们不聊那些老生常谈的重启大法,而是从几个容易被忽略的排查方向入手,看看问题到底藏在哪里。

磁盘I/O异常:被忽视的卡死诱因

硬件层:别光看CPU和内存,磁盘I/O才是隐形杀手

很多运维同行遇到服务器无响应,第一反应就是看CPU负载和内存占用。但有一种情况很迷惑:CPU空闲,内存充足,系统却时不时像被点了暂停键。这时候你要把目光转向磁盘I/O。机械磁盘的坏道、RAID卡电池失效、SSD固件bug,都会导致读写请求长时间卡住,进而拖垮整个系统。怎么查?别只看`top`,用`iostat -x 1`观察`%util`和`await`,如果`await`动不动就上百毫秒,那磁盘八成在“磨洋工”。另外,别忘了检查硬件的`dmesg`输出,里面往往藏着SCSI错误、磁盘重试这类早期信号。

系统日志分析:重启前先还原故障时间窗

系统日志:/var/log里的线索,你翻过几页?


重启之前,有多少人会先去翻一翻 /var/log/messages 或者 journalctl?说实话,很多人是直接重启,等下次再犯才想起来看日志。间歇性无响应之前,系统通常会有一些预兆,比如 OOM killer 开始杀进程,或者某个服务频繁 Segmentation Fault。日志不会告诉你"我要挂了",但会留下"凶手"的指纹。重点看 /var/log/syslog、/var/log/kern.log,还有 Nginx、MySQL、PHP 这些应用的 error log。如果你发现某个时间点日志突然中断,之后系统恢复,那这个中断点就是问题爆发的时间窗。顺着时间线往前推,通常能找到压死骆驼的最后一根稻草。别忘了 dmesg -T,它能给出带人类可读时间戳的内核环形缓冲区信息,很多硬件错误、驱动异常、OOM 记录首先出现在这里,而未必及时落盘到 syslog。另外要注意日志本身的完整性——如果系统卡死时日志服务也跟着停了,那你看到的"平静"可能只是假象,必要时用 journalctl --list-boots 对比不同启动周期,确认问题到底发生在哪一次运行里。

面对间歇性无响应,除了重启,还有哪些你忽略的排查突破口?

网络路径排查:识别链路假死与丢包

网络层:间歇性无响应也可能是"假死"在网络路径。有时候服务器本身好好的,但业务端就是连不上。这种"无响应"未必是服务器挂了,而是网络链路在捣乱。比如交换机端口协商失败、网卡驱动异常、网线松动或者光模块衰减,都会造成丢包或延迟抖动。你可以在服务器上长期跑一个 ping 脚本记录丢包率,也可以检查 ethtool -S eth0 里的 rx_dropped 和 tx_timeout 计数,ethtool -k eth0 还能看 offload、TSO、GRO 等特性是否在特定网卡上引发异常。更隐蔽的是 TCP 队列溢出,当 /proc/net/sockstat 里的 TCPBacklogDrop 持续增长,说明应用层 accept 速度跟不上,连接在排队中被强制丢弃。这时候业务方会抱怨"服务器没反应",但实际是网络栈堵住了。还可以顺带看看 ss -s 的统计概览、netstat -s 里的重传和错误计数,以及 ip -s link 里的丢包明细。如果是云主机,别忘了安全组、限速策略和底层宿主的"静默丢包"——有时候问题根本不在你的机器上,而在你看不见的那一层。

进程线程排查:捕捉毛刺负载与D状态

进程与线程:谁在偷偷占着 CPU 时间片?top 命令显示的是瞬间快照,对于"间歇性"问题,你得用 pidstat 或者 atop 做持续采集。有些进程平时很安静,但每隔几分钟会触发一次定时任务,瞬间把 CPU 打满,然后迅速回落。这种毛刺型负载在普通 top 里很难抓到,除非你刚好在那个秒级窗口里按下了 1。pidstat -u 1 能按秒粒度记录每个进程的 CPU 占用,pidstat -d 看 I/O,pidstat -w 看上下文切换——上下文切换异常飙升往往是无响应的重要前兆。另外,不可中断睡眠状态(D state)的进程也是重点。如果某个进程长期处于 D state,多半是它正在等待底层 I/O 返回,而底层设备已经"装死"。可以通过 /proc/sysrq-trigger 里的 w 来获取阻塞堆栈,或者用 cat /proc/进程/stack 看看卡在哪个内核函数里。再补充一个容易被忽视的角度:内存回收(direct reclaim)和 NUMA 失衡也会让进程"集体发呆",用 vmstat 1 观察 wa、si、so 三列,能快速判断瓶颈是 I/O、换页还是 CPU。必要时用 perf top 或 perf record 抓一段火焰图,看看内核态时间到底花在哪。

内核参数与文件描述符泄漏:被忽略的"慢耗"。很多服务器跑着跑着就慢半拍,而且越来越频繁。如果你检查了硬件、日志、网络都没问题,那不妨看看内核参数是否到了上限。最典型的就是 file-max 和 ulimit -n。如果一个进程的文件描述符被耗尽,新连接根本进不来,表现就是应用卡住,重启后立刻恢复,但过几天又复发。你可以用 lsof -p 进程号 | wc -l 看进程实际占用的 fd 数,再用 cat /proc/sys/fs/file-nr 看系统总分配数。如果接近上限,就得调整 /etc/security/limits.conf 或者审查代码里有没有泄漏的 socket、文件句柄。另一个容易忽略的是 TCP 连接跟踪表,conntrack 满了之后,新连接会被直接丢弃,系统看起来像是"拒绝服务",但其实是内核参数没调优——用 conntrack -C 看当前条目数、对照 net.netfilter.nf_conntrack_max 就能判断。类似地,pid_max、threads-max、vm.max_map_count、net.core.somaxconn 这些参数在高压场景下都可能成为隐形天花板,出现"重启就好、过几天又犯"的典型症状时值得逐一核对。还有一个常被低估的点:TIME_WAIT 堆积。短连接密集的服务如果 net.ipv4.tcp_tw_reuse 没开、端口范围又小,很容易在高峰期把可用端口耗光,表现同样是"连不上但机器没死"。

监控历史数据:与其猜,不如复盘趋势。遇到间歇性无响应,别急着拍脑袋。看看监控系统里的历史曲线,哪怕只是 sar 记录的数据。sar -q 可以查看历史负载,sar -r 看内存,sar -d 看磁盘,sar -n DEV 看网络吞吐,sar -W 看换页活动。很多时候问题发生之前会有一个缓慢爬坡的过程,比如内存可用率每天下降一点,或者 swap 使用量逐渐增加。这种趋势如果不拉长周期,光看当下是发现不了的。用 top 看一万次,不如把 /var/log/sa/ 下的历史数据翻出来比对。如果你连 sar 都没开,那下次只能继续"重启大法"了。建议先把 sar 日志和监控留存开起来——sysstat 默认的采集粒度通常是 10 分钟,对排查毛刺问题偏粗,可以调成 1 分钟并延长保留天数,这是复盘故障的底牌。有条件的话,把关键指标接入 Prometheus + Grafana 之类的时序监控,设置内存、fd、conntrack、D 状态进程数的告警阈值,让"预兆"主动找你,而不是等你去翻。

间歇性无响应最麻烦的地方在于"难以复现"。但别让重启成为你唯一的工具。硬件磁盘、系统日志、网络链路、进程状态、内核参数、历史趋势,每一个方向都可能藏着突破口。下次再遇到这个问题,先别急着重启,花几分钟看一眼这些地方,也许根因就浮出水面了。更进一步,可以养成"重启前先留证"的习惯:抓一份 dmesg、一份 ps auxf、一份 ss -s、一份 vmstat 1 5,再打包相关日志的时间窗,哪怕当时没空分析,也为事后复盘留下了线索。真正的高手不是不重启,而是每次重启之前,都顺手把"案发现场"保存下来。复盘留下了线索。真正的高手不是不重启,而是每次重启之前,都顺手把"案发现场"保存下来。


此内容由AI生成

赞(666)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。