一般情况下,服务器不太会出问题。但是遇到特别诡异的情况,多半是服务器本身的问题。遇到问题,我们不能一味的去排查应用,中间件。更应该想到服务器的问题。否则很容易出现南辕北辙的情况。这次分享的是一次服务器故障,导致的线上问题。涉及到了服务器的内存的排查,和CPU的排查。
现象:
线上es集群突然报警。本来一个机器上两个节点,但是在早晨6点48分,突然cpu飙升到100,期间没有什么查询,正常量的写入。
关闭一个节点以后,负载正常,但是再启动节点,集群负载还是很高。
请求命中此台机器,触发了很多的慢查询告警 。
该节点 gc的时间特别长
[2023-11-21T11:36:38,263][WARN ][o.e.m.j.JvmGcMonitorService] [10.99.100.98] [gc][young][1279][13] duration [2.4s], collections [1]/[2.5s], total [2.4s]/[44.4s], memory [2.9gb]->[1.4gb]/[31.9gb], all_pools {[young] [1.5gb]->[0b]/[0b]}{[old] [1.3gb]->[1.3gb]/[31.9gb]}{[survivor] [52.5mb]->[32.3mb]/[0b]}
[2023-11-21T11:36:38,274][WARN ][o.e.m.j.JvmGcMonitorService] [10.99.100.98] [gc][1279] overhead, spent [2.4s] collecting in the last [2.5s]
监控如下,可以看出来CPU飙升
同时间段其它机器的监控
排查linux日志
grep -i cpu /var/log/messages
使用 dmesg 命令可以查看内核环缓冲区的内容,其中包含了系统启动时和运行时的信息,包括一些硬件错误。查看排查cup问题。
dmesg | grep -i cpu
[11215201.664127] CPU20: Package temperature above threshold, cpu clock throttled (total events = 1493)
[11215201.664168] CPU56: Package temperature above threshold, cpu clock throttled (total events = 1493)
这里是cpu过热保护发生的次数
[20227904.755122] EDAC skx MC0: CPU 0: Machine Check Event: 0x0 Bank 1: 0x940000000000009f
[20227904.755820] EDAC MC0: 0 CE memory read error on CPU_SrcID#0_MC#0_Chan#0_DIMM#0 (channel:0 slot:0 page:0x7c960e offset:0xdc0 grain:32 syndrome:0x0 - err_code:0x0000:0x009f socket:0 imc:0 rank:1 bg:1 ba:0 row:0x1d4a9 col:0x2d8)
dmesg | grep -i memory
查看排查内存问题
[20227904.755121] EDAC skx MC0: HANDLING MCE MEMORY ERROR
[20227904.755820] EDAC MC0: 0 CE memory read error on CPU_SrcID#0_MC#0_Chan#0_DIMM#0 (channel:0 slot:0 page:0x7c960e offset:0xdc0 grain:32 syndrome:0x0 - err_code:0x0000:0x009f socket:0 imc:0 rank:1 bg:1 ba:0 row:0x1d4a9 col:0x2d8)
section_type: memory error 表示这是一个内存错误。
EDAC skx MC0 表示这是与 EDAC(Error Detection and Correction)相关的信息。
HANDLING MCE MEMORY ERROR 指示系统正在处理一个 MCE(Machine Check Exception)的内存错误。
EDAC MC0: 0 CE memory read error 表示这是一个可纠正的内存读取错误。
CPU_SrcID#0_MC#0_Chan#0_DIMM#0 提供了有关错误位置的详细信息,指明了错误发生在第一个 CPU(CPU 0)的第一个内存通道(channel 0)的第一个 DIMM(DIMM 0)。
channel:0 slot:0 指示错误发生在通道 0 的插槽 0。
page:0x7c960e offset:0xdc0 提供了错误地址的详细信息,包括页面、偏移。
syndrome:0x0 表示错误的纠错码。
err_code:0x0000:0x009f 提供了错误代码,这里指示了一个 CE(Correctable Error)错误。
socket:0 imc:0 rank:1 bg:1 ba:0 row:0x1d4a9 col:0x2d8 提供了更详细的关于错误位置的信息,包括套接字、内存控制器、rank、bank、行和列。
这里有一篇参考文
和我遇到的现象一样。可能是内存有问题
Linux服务器EDAC CE memory read error - 简书
故障处理
结合监控信息,我最先想到的是的服务器存在问题。于是就检查了内存和cpu。从排查的信息来看,多半是硬件存在问题。于是联系运维,与机房人员。由于是数据集群,先把服务器上的数据迁移到别的机器上,然后做重启操作。结果发现服务器起不开了,厂商的人过来升级了固件版本,做了修复。然后观察了两天,没有再发现系统异常日志。重新加回集群。我们这次遇到的不算是内存条有问题。但是也属于服务器故障,导致的应用故障。