作者:Daniel Robbins
CPU 和内存疑难问题解答
linux 负有盛名的特点之一是其非凡的稳定性。然而,假如您的硬件有缺陷或配置不正确,即使是世界上最稳定的操作系统也不会对您有什么帮助。本文中,Daniel Robbins 将告诉您如何诊断和修复 CPU 问题,并告诉您如何测试 RAM 缺陷。通过学习本文,您将学会确保您的 Linux 系统达到尽可能好的的稳定性。
在 Linux 世界中,我们中的许多人已遭受过令人深恶痛绝的硬件问题之苦。许多人曾经配置了一台 Linux 机器、安装了最喜欢的分发软件、编译并安装了一些附加应用程序并且使各个部件都运行顺利,到最后发现新系统中有一个致命的硬件错误?无论是随机分段错误、数据毁坏、硬锁定、还是丢失数据其结果都是一样的 -- 硬件故障使通常情况下可靠的 Linux 操作系统几乎无法顺利运行。本文中,我们将深入探讨如何检测 CPU 和 RAM 问题 -- 在缺陷部件造成一些严重的破坏之前就答应更换它们。
假如您正遭遇不稳定问题并且猜测该问题与硬件有关,我鼓励您测试 CPU 和内存以确保它们工作正常。但是,即使您尚未碰到这些问题,执行 CPU 和内存测试仍不失为一个好主意。在测试 CPU 和内存中,您可能会检测到硬件问题,它可能会在某个不适当的时候给您带来麻烦,并可能已经造成了数据丢失或让您花了数小时却搜索不到问题的根源。正确地,前瞻性地应用这些技术可帮助您避开这些令人头疼的问题,并且假如系统通过了测试,您即可放心,系统是符合规范的。
CPU 问题
假如您有一个非常糟糕的 CPU,您的机器可能无法引导 Linux 或仅运行几分钟便被锁定。由于症状非常明显,所以轻易诊断出这种不良状态下的 CPU 是有缺陷的。但更多的是一些不易检测到的细微的 CPU 缺陷;一般情况下,不太明显的错误能引起机器无明显原因的不时锁定,或导致某些进程意外死掉。多数 CPU 不稳定问题可通过“考验”CPU 来触发 -- 给 CPU 分配大量的工作,促使其变热,甚至在可能的情况下使它休眠。让我们看一下压力测试 CPU 的一些方法。
当听说测试 CPU 稳定性的最好方法之一是 Linux 内建的 -- 内核编译,您可能会感到希奇。gcc 编译器是测试一般 CPU 稳定性的一个很好的工具,内核编译将充分使用 gcc。通过在 /usr/src/linux 目录创建并运行下面的脚本可以对您的机器进行 industrial-strength 内核编译压力测试:
cpubuild 脚本
#!/bin/bash
make dep
while [ "foo" = "foo" ]
do
make clean
make -j2 bzImage
if [ $? -ne 0 ]
then
echo OUCH OUCH OUCH OUCH
exit 1
fi
done
您将注重到此脚本重复编译内核。原因很简单 -- 一些 CPU 有断断续续的小故障,使得它们在 95% 的时间里顺利地编译内核,但又不时地使内核编译崩溃。通常情况下,这是因为在处理器加热到一定温度(在该温度下处理器变得不稳定)之前可能进行了 5 个或更多内核编译。
在上面的脚本中,注重调整 -j 选项,使紧跟它的数字等于系统中 CPU 的数目加 1;换句话说,若是单处理器使用 "2",双处理器使用 "3",依此类推。-j 选项告诉 make 程序行平行编译内核,确保在编译每个源文件后总有至少一个 gcc 进程预备就绪 -- 确保 CPU 承受的压力达到最大。假如下午不预备使用 Linux 机器,请继续运行此脚本并让机器重新编译内核几个小时。
可能的 CPU 问题
假如脚本持续几个小时运行顺利,祝贺您!您的 CPU 已经通过了第一个测试。但是,上述脚本可能会意外死掉。如何知道是 CPU 有问题而不是其它的问题呢?假如 gcc 发出与下面类似的错误,则很有可能是 CPU 有问题:
gcc: Internal compiler error: PRogram cc1 got fatal signal 11
这时,CPU 有三种可能的状态:
假如您输入 "make bzImage" 重新进行内核编译,并且编译器死在同一文件上,请继续一遍遍输入 "make bzImage"。假如试了大约十次之后,编译进程继续死在此特定文件上,那么问题很可能是由(很少)gcc 编译器错误引起的,该错误是由此特定的源文件而不是有问题的 CPU 触发的。但是,这些天 gcc 很稳定,那么这种情况发生的可能性很小。
假如您输入 "make bzImage" 重新进行内核编译,并且稍后得到另一个信号 11,那么您的 CPU 很可能快要无法使用了。
假如您输入 "make bzImage" 重新进行内核编译并且内核编译成功,那也不意味着您的 CPU 是好的。通常这意味着仅当 CPU 升到一定的温度以上(CPU 使用超过一定时间后会变热,可能进行过几次内核编译后能达到此临界点),CPU 故障才不时地显露出来。
抢救 CPU
假如您的 CPU 在重负载之下正发生随机的断断续续的错误,可能您的 CPU 根本没什么问题 -- 可能只是冷却不当。您可以检查下列内容:
您的 CPU 风扇是否已插上?
它是否能相对地避免灰尘?
通电时风扇确实旋转(并以适当的速度旋转)吗?
散热片在 CPU 上固定好了吗?
在 CPU 和散热片之间有导热胶吗?
您的机器通风情况足够好吗?
假如一切正常,您可能希望让此打开的机器返回到内核编译测试。请让内核编译进行大约五分钟时间,然后将手放到这个正在运行的机器中并触摸四周的供电设备的外部金属保护外套。然后,用指尖小心地测试散热片的温度。假如异常地热,那么很可能您的散热片/风扇组合相对于您的特定 CPU 来说不够强劲。在这种情况下,升级您的系统冷却硬件 -- CPU 尚未遭受任何永久性损坏并且仍然可发挥作用。
最终 CPU 测试
内核编译测试是测试 CPU 稳定性的一个很好的方法,但还有一个更极端的 CPU 测试方法,或许您希望使用。我将这种方法保留到最后,是因为假如 CPU 只粗略地冷却过,这种非凡的测试可能会真的使其过热,理论上会对 CPU 造成永久性损坏。这种测试倾向于那些通过内核测试,没有什么问题的系统 -- 那些您希望确保即使 CPU 负载达到极限也能轻松处理的系统。假如您的 CPU 已经过适当地冷却,将会通过这个测试,假如没通过,则需要进一步冷却。
要执行 "最终" CPU 测试,所做的第一件事是转到 Lm_sensors 页(请参阅参考资料)并下载 lm_sensors 软件包。源 tarball 包含各种内核模块,这些模块结合了几乎已内建在所有当今主板上的健康监视功能。一旦正确安装了软件包并且装载(使用 prog/detect/sensors-detect 脚本指出装入哪些模块)合适的模块,您将看到一些新文件和目录出现在 /proc/sys/dev/sensors 下。这些文件包含方便的信息如 CPU 风扇速度、CPU 和主板温度读数以及主板电压读数,所有这些信息都会实时更新。由于我配置此软件包收到了较好的效果,所以我推荐您配置此软件包作为模块编译并使用 sensors-detect 脚本来指出引导时装入哪些模块。
一旦装入了 lm_sensors 模块,我推荐您安装一个图形 CPU/传感器监视器,它使您能够实时观察 CPU 负载和温度而无须重复地在 /proc/sys/dev/sensors 中 "cat" 文件。出于这个目的,我使用一个称为 gkrellm (请参阅参考资料)的很小的程序。这是我的 gkrellm 应用程序的快照,用来监视 CPU 使用情况、主板温度设置和其它一些事情:
gkrellm 正在运行
还有其它与 lm_sensors 兼容的图形监视软件包可用;您会发现在 lm_sensorshome 主页的"链接"部分上,列出了许多这种软件包。
最后一步预备步骤是下载 cpuburn 程序(请参阅参考资料)。这个方便的小程序使用机器指令的手工组合为您的特定 CPU 施加最大的压力 -- 甚至比重复的内核编译的压力还要大一些。档案中包含的多种小程序被定制为设置 P5 和 P6 级处理器,和 AMD K6 的非凡版本。一旦已将 cpuburn tarball 解包,请读 README 文件;它说明如何编译所包含的汇编源文件。完成这些后,您将拥有自己的 cpuburn 小程序。
现在,等待测试。我通常启动我的图形传感器监视器,然后作为 root 启动 cpuburn 程序。然后,观察 CPU 温度读数上升并变稳,让 cpuburn 保持运行大约一个小时。假如重复这些步骤而且 CPU 温度持续上升到异常高的温度(160 华氏度左右将被认为是“异常”高),那么您的 CPU 冷却系统需要大的调整。假如机器崩溃或锁定,或 cpuburn 进程死掉,那么您的 CPU 冷却需要改进 -- 或者可能您的特定 CPU 只是简单地不符合“规范”。您可以使用 CPU 温度读数作出判定。但假如一切顺利,那么您的系统将可应付所有的挑战。大约一小时后,您可以继续进行并杀死 cpuburn 程序,恢复正常操作。
内存测试
拥有一个完全可靠的 CPU 的确很重要,但拥有一个非常稳固的 RAM 芯片也很重要。有些人认为 SIMMS 和 DIMMS 永远不会坏,从不需要测试。不幸的是,这种想法是错误的 -- 坏的内存非常普遍,我们都需要注重内存问题。另有一些人认为假如可能有坏的 RAM,引导时 BIOS 内存检查会检测出所有的 RAM 错误。这种想法也是错误的;BIOS 内存检查检测不到许多坏的 RAM,所以不要让 BIOS 检查给您一种安全的错觉。
坏内存症状
好的,这里有一个坏的 RAM,或许现在正在您的机器里面。这里有一些警告迹象指出您的机器包含坏的 RAM:
当同时装载大量的程序时,不时有某个程序无明显原因地死掉。
不时地,打开一个文件时,显示文件被毁坏。假如稍后打开,文件看起来又好了。
当抽取 tarball ("tar xzvf") 时,tar 频频报告 tarball 已毁坏。过几天再次尝试抽取 tarball 时 tar