喜欢IT的一个“武痴”! 喜欢追求新技术、探索技术!
分类: 系统运维
2012-12-13 09:09:22
Sun服务器在运行过程中经常出现Panic的现象,查看log会发现类似UE、CE、WDC、UCC等等错误事件,这些错误信息基本上都跟cpu/memory有关,软件或硬件引故障都会引该类型的错误发生。
该博客发布后,文档格式全变了,请参考我发布在豆丁的文档:
内存故障类型及处理
1.CE(corrected error)类错误
该类错一般分为soft errors和hard errors两种,soft errors错误指内存的某一个位(bit)通过ECC校验发现存在错误并加以纠正,该类错误是暂时性的,所谓暂时性就是指内存该字节的错误位纠错后就可以正确使用了。
Hard errors一般指硬件类的错误,该种错误发生时,内存某个存储单元里的一个位永远为0或1,该错误是因为内存的某个位硬件永久性损坏了导致的。
2.UE(Uncorrectable Errors)类错误
UE类错一般会引起cpu的panic,当CE类错被检测时内存存储单元某个位出现了错误,如果此时同一个存储单元另一个位出现错误的话,就会产生一个UE(Uncorrectable Errors)类的错误,或者内存一个字某位出错了,但是系统无法纠正时我们仍把它叫做UE类错,为了保证系统的可靠性和数据的准确性,OS极有可能reboot系统。
3.如何得到更为详尽的内存错误信息
kernal update 21(即1085280-21)的solaris 8可以将出错的cpu offline掉,还可以执行page Retirement的操作(特别是在出现CE类问题并同时出现ME,即UE ,mutil bit类错误的时候),该操作将禁止使用相关的故障内存,这需要在/etc/system文件加入以下的一行:
automatic_page_removal=1
我们UT现场很多系统版本比较低,所以这些参数设置在低版本的kernel不能起作用,建议有机会最好都能升级上来。
以下的参数可以帮助我们记录更详细内存出错log。
Variables |
Values |
set ce_verbose_memory=[0/1/2] set ce_verbose_other=[0/1/2] |
A value of 0 indicates no logging. A value of 1 indicates that the messages are sent to the log file, but not the console. A value of 2 indicates that the messages are sent to the console and the log file. The default value is 1. |
set automatic_page_removal=[0/1] |
A value of 0 disables the page retirement feature. A value of 1 enables the page retirement feature. The default value depends upon the kernel patch release。 |
set ecc_softerr_interval=1440 set ecc_softerr_limit=2 |
The interval measured in minutes and number of acceptable CEs within this interval. Used by the Leaky Bucket algorithm to determine when to begin page retirement. It is acceptable to have ecc_softerr_limit CEs within ecc_softerr_interval minutes. Beyond this threshold, begin page retirement. These values are the defaults. |
set max_pages_retired_bps=10 |
Limits the number of physical memory pages which can be retired. This number is a percentage of physical memory stored as basis points, where 100 basis points is 1%. The default is 10, or.1% of physical memory. |
4.Scrubber
CE类错误纠正的实现是靠solaris的一个叫Scrubs的程序来完成的,Scrubs进程是通过重写内存字来实现纠错的。如果CPU在访问一个内存单元发现了错误,该程序就会将错误内存字擦除掉然后写入一个正确的字并记录下这个事件而报告相关信息到messages文件里面。
内存的错误有以下几种类型:
a. "Intermittent" – 间歇性error
这种错误是在scrubber程序已经檫除重写后仍然存在错误位的一种情况。如果此种错误发生的话,一般建议立即更换相关内存条来防止系统出现异常。
以上的内存出错都能在messages文件里找到Intermittent,Persistent,Sticky等关键字。
CPU出错类型
CPU的故障是最难辨别的,一般来说,系统messages文件都会报告某一个事件发生在某某cpu上,错误信息有点类似于内存错,但绝对不会出现具体的内存问题那样的信息。另外就是大多数机器直接crash掉,不报告任何错误信息,比如 Netra 1120,Netra 1400,甚至Netra 20也是这样,1400和N20的基本上还能通过lom –a的输出中查找一下lom事件,如果有watchdog重置的事件发生的话,基本上可以判断为cpu的故障,在SMP的架构中一般系统都会有好几颗CPU,UT的机器一般至少有两颗CPU,如何判断是哪个CPU呢,按我们的经验,一般都是cpu0出现故障才会导致系统的crash。