周一早上九点出头,客户电话打过来,说那台跑 ERP 的机器"卡得没法用",打开什么都转圈。

我先没当回事,以为是老毛病——磁盘 IO。这台机器是机械盘阵列,之前就闹过 IO 慢。第一反应就是上去看 iostat,结果 wa 才 3%,完全不像磁盘问题。

又看 load average,1.12 1.08 1.15,也不高。free -m 一看,还剩 12G 空闲,也没压力。

这就怪了。load 不高,IO 不高,内存够,可客户就是卡。

我 ssh 上去敲了个 top,看了一眼差点没认出来:进程列表里每个进程的 CPU 占用都只有零点几。更扎眼的是 top 最上面那行,显示 0.8 GHz。

0.8GHz。这机器是 E5-2650 v2,2.6GHz 的主频,跑在 0.8 上,等于降到三成不到。

第一反应:是不是被限制了?查 cpupower frequency-info,governor 是 performance,没毛病。又怀疑是不是被谁设了 max_freq,cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq,显示 2600000,也没问题。

那为啥频率上不去?这种情况大概率是过热降频。intel_pstate 在温度过高时会主动把频率压下来保护 CPU。

sensors 一看,CPU 温度 78 度。78 度不算低,但离过热保护还远。不过我往下翻,发现 CPU 风扇那行写着 0 RPM。

0 RPM。风扇不转,温度居然只有 78 度?这不对。要么传感器坏了,要么风扇真没转但散热片够大。反正 intel 那套机制是:风扇转速传感器读数为 0,固件认为风扇失效,直接触发降频保护——有些主板固件确实这么干,风扇报错就把 CPU 锁到最低档。

我一开始还不信,觉得这逻辑太蠢了。风扇传感器坏了,CPU 频率就锁 0.8GHz?又确认了一遍 sensors 输出:Fan1: 0 RPM,Fan2: 1523 RPM,Fan3: 1480 RPM。就 Fan1 是 0。

哦——这就说得通了。前面板六个风扇位,其中 CPU 散热器那个位接的是 Fan1,这个口子上的风扇或者线坏了,主板固件检测到 CPU 风扇转速为 0,直接按"CPU 风扇失效"处理,把频率锁死在最低档。

客户说这机器从上周五下午就开始卡,周末没人用,今天一来才发现。等于卡了三天。中间没人动过机器,这倒排除了"昨晚有人改了配置"的可能,也让我确定问题在硬件层。

处理:关机,拆侧板,把 CPU 散热器风扇的 4pin 线重新插了一下——其实就是线松了,插回去就好了,顺手把风扇上的灰吹了吹。开机,进系统,top 一看,2.6GHz,回来了。

前后折腾了一个小时,最后就是一根线没插紧。客户挺高兴,说"还是你们专业"。我没好意思说,真相是我们先怀疑了磁盘、又怀疑了负载、还怀疑了系统配置,最后才想到去看风扇。

复盘就一句话:卡顿不一定是 load 高,也可能是频率被压了。下次再遇到"啥指标都正常但就是卡"的机器,先看一眼 top 第一行的频率,再瞄一眼 sensors 里的风扇转速。风扇 0 RPM 这种事,sensors 不报错,但固件在偷偷限频。