[EDAC, amd64] defekte DIMM-Modul lokalisieren

21/04/2016 - 16:11 von Lars Uhlmann | Report spam
Ich bin das erste Mal mit defektem ECC-RAM in einem Server konfrontiert
und habe Schwierigkeiten, das bzw. die defekte(n) Modul(e) zu lokalisieren.

Das Mainboard ist ein ASUS KFSN5-D [0], alle 16 Slots sind mit je 4GB
bestückt, was insgesamt 64GB ergibt. Das zugehörige DIMM-Slot-Layout
sieht so aus (auch nochmal grafisch aus dem Handbuch [1]):

+-+ DIMM_B4
| CPU2 | DIMM_A4
+-+ DIMM_B3
DIMM_A3
DIMM_C1 DIMM_B2
DIMM_D1 DIMM_A2
DIMM_C2 DIMM_B1
DIMM_D2 DIMM_A1
DIMM_C3
DIMM_D3 +-+
DIMM_C4 | CPU1 |
DIMM_D4 +-+

Laut EDAC-Doku [2] ist der Memory Controller für CPU1 = MC0 und für
CPU2 = MC1. Damit ergibt sich, ebenfalls aus [2], folgende Zuordung

MC0 (CPU1)
+-+--+--+
| | Channel 0 | Channel 1 |
+-+--+--+
|csrow0 | DIMM_A1 | DIMM_B1 |
|csrow1 | DIMM_A1 | DIMM_B1 |
+-+--+--+
|csrow2 | DIMM_A2 | DIMM_B2 |
|csrow3 | DIMM_A2 | DIMM_B2 |
+-+--+--+
|csrow4 | DIMM_A3 | DIMM_B3 |
|csrow5 | DIMM_A3 | DIMM_B3 |
+-+--+--+
|csrow6 | DIMM_A4 | DIMM_B4 |
|csrow7 | DIMM_A4 | DIMM_B4 |
+-+--+--+

MC1 (CPU2)
+-+--+--+
| | Channel 0 | Channel 1 |
+-+--+--+
|csrow0 | DIMM_C1 | DIMM_D1 |
|csrow1 | DIMM_C1 | DIMM_D1 |
+-+--+--+
|csrow2 | DIMM_C2 | DIMM_D2 |
|csrow3 | DIMM_C2 | DIMM_D2 |
+-+--+--+
|csrow4 | DIMM_C3 | DIMM_D3 |
|csrow5 | DIMM_C3 | DIMM_D3 |
+-+--+--+
|csrow6 | DIMM_C4 | DIMM_D4 |
|csrow7 | DIMM_C4 | DIMM_D4 |
+-+--+--+

Nun die fehlerhaften Speicherstellen:

] $ edac-util -v |egrep '[1-9]+\ Corrected'
] mc1: csrow2: ch0: 1223 Corrected Errors
] mc1: csrow3: ch0: 9 Corrected Errors
] mc1: csrow4: ch0: 4 Corrected Errors

Damit kann man aus obigen Zuordungstabellen ablesen, daß die
defekten Module in den Slots DIMM_C2 und DIMM_C3 zu finden sind.

Soweit so gut. Nun die Frage, ob meine Zuordnung der DIMM-Slots
zum "Chip-Select Row"-"Channel table"-Layout stimmt? Ich hab mich
am Beispiel in der Doku orientiert. Paßt das auch bei meinem/jedem
Board?
Klar könnte ich jetzt einfach die herausgefunden Module ziehen, aber wenn
es die nicht sind, müßte ich ja dann jedes Modul testen, was ohne
zweiten identischen Server mühsam wird.
Mich mach auch folgendes stutzig. Ich hab am 9.4. die Slots DIMM_A4,
DIMM_B4, DIMM_C4 und DIMM_D4 bestückt, die vorher leer waren. Just danach
tauchten die Fehler auf. Ich hàtte dann aber eher Fehler in den neu
bestückten Slots erwartet.

Eine andere Herangehensweise: die Module bilden den Speicher ja linear ab,
also DIMM1: 0-4GB, DIMM2: 4-8GB usw., wie ist dabei die Slot-Reihenfolge?
So, wie physisch auf dem Board, also DIMM_A1, DIMM_B1, ..., DIMM_C4,
DIMM_D1 oder DIMM_A1, DIMM_A2, DIMM_A3, DIMM_A4, ..., DIMM_D3, DIMM_D4?
Dann könnte man über der Adresse der defekten Speichstellen das Modul
finden

Danke für die Hilfe
Lars

[0] https://www.asus.com/Commercial-Ser...ons/KFSN5D
[1] https://secure.lars-uhlmann.de/temp...page24.pdf
[2] https://www.kernel.org/doc/Documentation/edac.txt
 

Lesen sie die antworten

#1 Lars Uhlmann
21/04/2016 - 17:42 | Warnen spam
Mit »dmidecode« zeigt es mir die Speichermodule in linearer Reihenfolge
an:

] $ dmidecode -t 20 |egrep '(^Handle|ing\ Address)'
]
] Handle 0x0044, DMI type 20, 19 bytes
] Starting Address: 0x00000000000
] Ending Address: 0x000FFFFFFFF
] Handle 0x0046, DMI type 20, 19 bytes
] Starting Address: 0x00100000000
] Ending Address: 0x001FFFFFFFF
] Handle 0x0048, DMI type 20, 19 bytes
] Starting Address: 0x00200000000
] Ending Address: 0x002FFFFFFFF
] Handle 0x004A, DMI type 20, 19 bytes
] Starting Address: 0x00300000000
] Ending Address: 0x003FFFFFFFF
] Handle 0x004C, DMI type 20, 19 bytes
] Starting Address: 0x00400000000
] Ending Address: 0x004FFFFFFFF
] Handle 0x004E, DMI type 20, 19 bytes
] Starting Address: 0x00500000000
] Ending Address: 0x005FFFFFFFF
] Handle 0x0050, DMI type 20, 19 bytes
] Starting Address: 0x00600000000
] Ending Address: 0x006FFFFFFFF
] Handle 0x0052, DMI type 20, 19 bytes
] Starting Address: 0x00700000000
] Ending Address: 0x007FFFFFFFF
]
] Handle 0x0054, DMI type 20, 19 bytes
] Starting Address: 0x00000000000
] Ending Address: 0x000FFFFFFFF
] Handle 0x0056, DMI type 20, 19 bytes
] Starting Address: 0x00100000000
] Ending Address: 0x001FFFFFFFF
] Handle 0x0058, DMI type 20, 19 bytes
] Starting Address: 0x00200000000
] Ending Address: 0x002FFFFFFFF
] Handle 0x005A, DMI type 20, 19 bytes
] Starting Address: 0x00300000000
] Ending Address: 0x003FFFFFFFF
] Handle 0x005C, DMI type 20, 19 bytes
] Starting Address: 0x00400000000
] Ending Address: 0x004FFFFFFFF
] Handle 0x005E, DMI type 20, 19 bytes
] Starting Address: 0x00500000000
] Ending Address: 0x005FFFFFFFF
] Handle 0x0060, DMI type 20, 19 bytes
] Starting Address: 0x00600000000
] Ending Address: 0x006FFFFFFFF
] Handle 0x0062, DMI type 20, 19 bytes
] Starting Address: 0x00700000000
] Ending Address: 0x007FFFFFFFF

Ich nehme an, weil es sich um ein Zwei-Sockel-Opteron-Board handelt und
jede CPU ihren eigenen Memory Controller hat, fàngt die Adressierung des
zweiten DIMM-Arrays wieder bei 0x00000000000 an.

D.h., um eine absolute Adresse einem Modul zuordnen zu können, muß man
zur Addressierung des zweiten Arrays die Speicherkapazitàt des ersten
addieren. Bei mir ist jeder Slot mit 4GB belegt, DIMM-Array1 hat also
32GB (0x007FFFFFFFF GB). Für Ausgabe von »dmidecode« ergibt sich damit:

Handle 0x0054: 0x00800000000 - 0x008FFFFFFFF
Handle 0x0056: 0x00900000000 - 0x009FFFFFFFF
Handle 0x0058: 0x00A00000000 - 0x00AFFFFFFFF
Handle 0x005A: 0x00B00000000 - 0x00BFFFFFFFF
Handle 0x005C: 0x00C00000000 - 0x00CFFFFFFFF
Handle 0x005E: 0x00D00000000 - 0x00DFFFFFFFF
Handle 0x0060: 0x00E00000000 - 0x00EFFFFFFFF
Handle 0x0062: 0x00F00000000 - 0x00FFFFFFFFF

EDAC meldet folgende defekten Speicheradressen (exemplarisch drei
herausgegriffen): 0x87750b000, 0x90fef4610, 0xb97688050

Die zugehörigen Handles sind 0x0054, 0x0056, 0x005A. Das wiederum führt
dann zu den DIMM-Slots (exemplarisch nur der erste):

] $ dmidecode -t 20 |egrep -A7 '^Handle 0x0054' |grep 'Physical'
] Physical Device Handle: 0x0053
] $ dmidecode -t 17 |egrep -A17 '^Handle 0x0053' |grep 'Locator'
] Locator: DIMM_C1
] Bank Locator: BANK5

Für alle drei Speicherstellen sind das DIMM_C1, DIMM_D1 und DIMM_D2.
Das paßt aber nicht zur Lokalisierung über EDAC (DIMM_C2 und DIMM_C3)!?

Irgendwo habe ich Denkfehler oder die Lokalisierung funktioniert nicht.

Lars

Ähnliche fragen