포토로그



2018/09/21 12:19

mcelog를 사용한 ECC 오류 발생 DIMM 슬롯 찾기 GNU/Linux

* 추가(19/09/25): mcelog를 위한 모듈은 kernel 4.13+ 이후에는 legacy/deprecated로 분류되기 때문에, RHEL/CentOS 8이나, Ubuntu 18.04 버전 및 이후 버전에서는 더 나은 rasdaemon(ras-mc-ctl; https://pagure.io/rasdaemon) 사용을 권장드립니다! 앞에서 언급한 배포판에서는 관리되는 패키지에 속하므로, 이를 설치하시면 됩니다. ras-mc-ctl을 쓰면 더 쉽게 위치를 알 수 있을겁니다.

* 수정: 문제의 메모리 2개중 하나는 수정되었으나, 신규 교체한 다른 하나는 다시 오류 발생. 일반적으로 이런 경우가 흔치 않기 때문에 메인보드를 의심, 메인보드 교체를 통해서 문제를 해결함.

원내 업무를 위해 사용하는 서버 중, ECC-Registered DDR4를 사용하는 Xeon 서버에서 EDAC 오류가 발생.
개략적인 커널 로그는 다음과 같이 나타났다.

EDAC MC0: 18883 CE memory read error on CPU_SrcID#0_Ha#1_Chan#1_DIMM#1 (channel:5 slot:1 page:0x112558a offset:0x180 grain:32 syndrome:0x0 -  OVERFLOW area:DRAM err_code:0001:0091 socket:0 ha:1 channel_mask:2 rank:4)
EDAC MC0: 19729 CE memory scrubbing error on CPU_SrcID#0_Ha#1_Chan#0_DIMM#1 (channel:4 slot:1 page:0x2019a38 offset:0x0 grain:32 syndrome:0x0 -  OVERFLOW area:DRAM err_code:0008:00c1 socket:0 ha:1 channel_mask:1 rank:5)
EDAC sbridge MC0: HANDLING MCE MEMORY ERROR
EDAC sbridge MC0: CPU 0: Machine Check Event: 0 Bank 8: cc12b34000010091
EDAC sbridge MC0: TSC 0
EDAC sbridge MC0: ADDR fe6fed140 EDAC sbridge MC0: MISC 140646486
EDAC sbridge MC0: PROCESSOR 0:406f1 TIME 1537447326 SOCKET 0 APIC 0

EDAC 모듈에서 보고되는 CE(correctable error) 오류는 일반적으로 24시간 내 24회 미만일 경우 상대적으로 문제가 없다고 하지만, 이번 케이스는 24시간 내 2만번 이상의 유사 오류를 나타내고 있었다.

문제는 EDAC이 뿜어내는 커널 로그만 봐서는 문제가 있는 DIMM 모듈을 찾자니 이걸 어떻게 봐야하나.. 했다. 시스템도 재부팅 된지라 edac-util을 사용해도 DIMM 정보를 볼 수 없었다.

그래서 mcelog를 사용해서 추가 정보를 얻기로 했다:

MCE 0
CPU 0 BANK 7
MISC 1404aca86 ADDR 115d5be180
TIME 1533545053 Mon Aug  6 17:44:13 2018
MCG status:
MCi status:
Error overflow
Corrected error
MCi_MISC register valid
MCi_ADDR register valid
MCA: MEMORY CONTROLLER RD_CHANNEL1_ERR
Transaction: Memory read error
STATUS cc00030000010091 MCGSTATUS 0
MCGCAP 7000c16 APICID 0 SOCKETID 0
CPUID Vendor Intel Family 6 Model 79
Fallback Socket memory error count 22226 exceeded threshold: 22591 in 24h
Location SOCKET:0 CHANNEL:? DIMM:? []
Running trigger `socket-memory-error-trigger'
mcelog: Too many trigger children running already
Hardware event. This is not a software error.

이걸 또 어떻게 봐야 하나.. 게다가 location이 똑바로 찍히지 않는 상태. 대략 mcelog file format(http://www.mcelog.org/logfile.html)을 보아하니, ADDR이 오류가 발생된 물리 메모리 어드레스를 가리키고 있다고 나와 있어, dmidecode와 결합해서 슬롯을 찾기로 했다.

위 예시에서는 ADDR이 115d5be180이니, 앞에 0x가 붙을거고, dmidecode에서 각 슬롯별 어드레스 구간을 확인하고 찾아내면 될 것이다. 그럼 뭐가 필요한가? dmidecode -t 17,20 의 결과를 보고 찾아내면 된다.

DMI Type 17은 Memory device, Type 20은 Memory device mapped address를 가리키기 때문에, 20으로 address 구간을 찾고, 그에 해당하는 device를 찾아내면 된다. 각각의 DIMM 슬롯마다 17, 20의 정보가 순차적으로 뜨기 때문에, Type 20의 address 구간을 찾으면 바로 위의 Type 17 정보를 보고 DIMM 슬롯을 찾는다.

문제가 된 서버의 dmidecode Type 17, 20의 구간 결과는 아래와 같다:
Handle 0x006B, DMI type 17, 40 bytes
Memory Device
        Array Handle: 0x0069
        Error Information Handle: Not Provided
        Total Width: 72 bits
        Data Width: 72 bits
        Size: 16384 MB
        Form Factor: DIMM
        Set: None
       Locator: DIMM_C1
        Bank Locator: NODE 2
        Type: DDR4
        Type Detail: Synchronous
        Speed: 2133 MHz
        Manufacturer: Samsung
        Serial Number: 88044278
        Asset Tag: DIMM_C1_AssetTag
        Part Number: M393A2G40EB1-CPB
        Rank: 2
        Configured Clock Speed: 2133 MHz
        Minimum Voltage: Unknown
        Maximum Voltage: Unknown
        Configured Voltage: Unknown

Handle 0x006C, DMI type 20, 35 bytes
Memory Device Mapped Address
       Starting Address: 0x01000000000
       Ending Address: 0x013FFFFFFFF

        Range Size: 16 GB
        Physical Device Handle: 0x006B
        Memory Array Mapped Address Handle: 0x006A
        Partition Row Position: 1

문제가 된 address는 0x0115d5be180 이니, 타입 20의 Starting Address와 Ending Address 사이에 있는지를 비교.
위와 같이, DIMM_C1 슬롯에 꽂혀 있는 DIMM 모듈이 문제가 있다는 것을 찾아낼 수 있었다. 여기서는 추가의 로그를 올리지 않았지만, DIMM_D2 슬롯 역시 문제가 있다는 것을 확인. 총 8개 슬롯이 있는 메인보드니, 5번째와 8번째 DIMM 모듈에 문제가 있다고 보면 된다. 물론, 채널 구성이 어떻게 되어 있냐에 따라 달라지기 때문에 나머지는 메인보드 레이아웃을 보면서 최종 위치를 잡아야 할 것이다. (아니면 시리얼 번호를 보고 찾던지) 잘 잡았는지는, 다시 dmidecode를 써서 시리얼 넘버가 잘 바뀌었는지를 확인하면 되는 셈.

ECC-Registered DDR4 16GB 메모리 모듈 두 개를 추가로 주문해서, 교체 후 다시 상황이 발생하는지 확인할 필요가 있다. 한달 넘게 돌려봐서 문제가 없는지 확인되면 업데이트 기록을 남길 예정이다.

사실 저게 떨어진 때가 두어달 전에 일어났던 일인데, 그 당시에는 memtest86+을 써서 테스트 했었는데 아무런 오류가 나타나지 않아 무시하고 있다가 이제서야 문제가 되는 슬롯을 찾으려고 발버둥을 쳤더랬다.