64비트 Linux가 3GB에서 32GB 사이의 RAM을 인식하지 못합니다.

64비트 Linux가 3GB에서 32GB 사이의 RAM을 인식하지 못합니다.

내 문제는 결함이 있는 메모리 모듈로 인해 발생했습니다.그리고 깨진 커널 바이너리일 수도 있습니다.


방금 기본적으로 새로운 하드웨어로 PC를 부팅했습니다. 저는 이전에 Debian 6.0 AMD64를 실행했는데 거기에는 아무런 변화가 없었습니다. (문자 그대로, 이전 마더보드에서 하드 디스크를 뽑아서 새 마더보드에 다시 연결했습니다.) 이상한 점을 발견했습니다:

  • 4 x 8GB RAM을 물리적으로 설치했습니다.
  • UEFI/BIOS 설정에서 16383MB의 RAM을 보고함
  • Linux에서는 free -m2985MB의 RAM이 보고됩니다.

uname -r2985MB는 순전히 우연 이라고 보기에는 마법의 3GB 표시에 너무 가까워 보이지만 2.6.32-5-amd64; 분명히 64비트 커널이었는데, 이것이 제가 사용하고 있는 시스템 드라이브에 설치된 전부입니다. 새 마더보드는 Asus M5A97 Pro로, 8GB 모듈을 지원하는 것으로 추정되는 4개의 DDR3 슬롯이 있습니다. 메모리 모듈 자체는 동일하며 4개의 Corsair XMS3 PC12800 8GB를 함께 구매했습니다.

UEFI 설정을 자세히 살펴보진 않았지만 살펴봤지만 대용량 RAM을 활성화하기 위해 변경해야 할 것 같은 내용은 아무것도 없었습니다.

편집하다:실제로 64비트를 실행하고 있음을 추가로 확인합니다.

# file `which free`
/usr/bin/free: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, stripped
#

이게 무슨 일이고, 어떻게 해야 합니까?

편집 2:요청에 따라 dmesg, dmidecode 및 meminfo. 지금은 시스템에 물리적으로 접근할 수 없으므로 오늘 밤까지 기다려야 일부 모듈을 꺼내서 어떤 기능을 하는지 확인해야 합니다. (dmidecode는 3 x 8GB와 1개의 빈 DIMM 슬롯을 보고합니다. 또한 커널의 MTRR 불일치 메시지에 주목하세요. 이로 인해 13GB의 손실이 발생하며 이는 최소한 마더보드 자체가 보고하는 것과 합산됩니다.)

# dmidecode --type memory
# dmidecode 2.9
SMBIOS 2.7 present.

Handle 0x0026, DMI type 16, 23 bytes
Physical Memory Array
        Location: System Board Or Motherboard
        Use: System Memory
        Error Correction Type: Multi-bit ECC
        Maximum Capacity: 32 GB
        Error Information Handle: Not Provided
        Number Of Devices: 4

Handle 0x0028, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0026
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM0
        Bank Locator: BANK0
        Type: <OUT OF SPEC>
        Type Detail: Synchronous
        Speed: 1333 MHz (0.8 ns)
        Manufacturer: Manufacturer0
        Serial Number: SerNum0
        Asset Tag: AssetTagNum0
        Part Number: Array1_PartNumber0

Handle 0x002A, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0026
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM1
        Bank Locator: BANK1
        Type: <OUT OF SPEC>
        Type Detail: Synchronous
        Speed: 1333 MHz (0.8 ns)
        Manufacturer: Manufacturer1
        Serial Number: SerNum1
        Asset Tag: AssetTagNum1
        Part Number: Array1_PartNumber1

Handle 0x002C, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0026
        Error Information Handle: Not Provided
        Total Width: 64 bits
        Data Width: 64 bits
        Size: 8192 MB
        Form Factor: DIMM
        Set: None
        Locator: DIMM2
        Bank Locator: BANK2
        Type: <OUT OF SPEC>
        Type Detail: Synchronous
        Speed: 1333 MHz (0.8 ns)
        Manufacturer: Manufacturer2
        Serial Number: SerNum2
        Asset Tag: AssetTagNum2
        Part Number: Array1_PartNumber2

Handle 0x002E, DMI type 17, 34 bytes
Memory Device
        Array Handle: 0x0026
        Error Information Handle: Not Provided
        Total Width: Unknown
        Data Width: 64 bits
        Size: No Module Installed
        Form Factor: DIMM
        Set: None
        Locator: DIMM3
        Bank Locator: BANK3
        Type: Unknown
        Type Detail: Synchronous
        Speed: Unknown
        Manufacturer: Manufacturer3
        Serial Number: SerNum3
        Asset Tag: AssetTagNum3
        Part Number: Array1_PartNumber3
#
======================================================================
# cat /proc/meminfo
MemTotal:        3056820 kB
MemFree:         1470820 kB
Buffers:          390204 kB
Cached:           194660 kB
SwapCached:            0 kB
Active:           488024 kB
Inactive:         419096 kB
Active(anon):     231112 kB
Inactive(anon):    96660 kB
Active(file):     256912 kB
Inactive(file):   322436 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 8 kB
Writeback:             0 kB
AnonPages:        322320 kB
Mapped:            33012 kB
Shmem:              5472 kB
Slab:             613952 kB
SReclaimable:     597404 kB
SUnreclaim:        16548 kB
KernelStack:        2384 kB
PageTables:        19472 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     1528408 kB
Committed_AS:     621464 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      294484 kB
VmallocChunk:   34359429080 kB
HardwareCorrupted:     0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:        9216 kB
DirectMap2M:     2054144 kB
DirectMap1G:     1048576 kB
#
======================================================================
# dmesg | grep -i memory
[    0.000000] WARNING: BIOS bug: CPU MTRRs don't cover all of memory, losing 13295MB of RAM.
[    0.000000] WARNING: at /tmp/buildd/linux-2.6-2.6.32/debian/build/source_amd64_none/arch/x86/kernel/cpu/mtrr/cleanup.c:1092 mtrr_trim_uncached_memory+0x2e6/0x311()
[    0.000000]  [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[    0.000000]  [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[    0.000000]  [<ffffffff814f7f1e>] ? mtrr_trim_uncached_memory+0x2e6/0x311
[    0.000000] initial memory mapped : 0 - 20000000
[    0.000000] init_memory_mapping: 0000000000000000-00000000bdf00000
[    0.000000] PM: Registered nosave memory: 000000000009d000 - 000000000009e000
[    0.000000] PM: Registered nosave memory: 000000000009e000 - 00000000000a0000
[    0.000000] PM: Registered nosave memory: 00000000000a0000 - 00000000000e0000
[    0.000000] PM: Registered nosave memory: 00000000000e0000 - 0000000000100000
[    0.000000] PM: Registered nosave memory: 00000000bd94d000 - 00000000bd99c000
[    0.000000] PM: Registered nosave memory: 00000000bd99c000 - 00000000bd9a6000
[    0.000000] PM: Registered nosave memory: 00000000bd9a6000 - 00000000bdade000
[    0.000000] PM: Registered nosave memory: 00000000bdade000 - 00000000bdaef000
[    0.000000] PM: Registered nosave memory: 00000000bdaef000 - 00000000bdb02000
[    0.000000] PM: Registered nosave memory: 00000000bdb02000 - 00000000bdb04000
[    0.000000] PM: Registered nosave memory: 00000000bdb04000 - 00000000bdb0d000
[    0.000000] PM: Registered nosave memory: 00000000bdb0d000 - 00000000bdb13000
[    0.000000] PM: Registered nosave memory: 00000000bdb13000 - 00000000bdb75000
[    0.000000] PM: Registered nosave memory: 00000000bdb75000 - 00000000bdd78000
[    0.000000] Memory: 3046732k/3111936k available (3075k kernel code, 4728k absent, 60476k reserved, 1879k data, 584k init)
[    1.636730] Freeing initrd memory: 9501k freed
[    1.647370] Freeing unused kernel memory: 584k freed
[    4.876602] [TTM] Zone  kernel: Available graphics memory: 1528410 kiB.
[    4.876615] [drm] radeon: 256M of VRAM memory ready
[    4.876617] [drm] radeon: 512M of GTT memory ready.
[   25.571018] VBoxDrv: dbg - g_abExecMemory=ffffffffa051d6c0
#

e820에 대한 Grepping은 e820 update range: 00000000bdf00000 - 000000043f000000 (usable) ==> (reserved). 43f000000은 16GiB이고 bdf00000은 3039MiB입니다. 그래요~ 아니다우연이라고 봅니다.

# dmesg | grep -i e820
[    0.000000]  BIOS-e820: 0000000000000000 - 000000000009d800 (usable)
[    0.000000]  BIOS-e820: 000000000009d800 - 00000000000a0000 (reserved)
[    0.000000]  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
[    0.000000]  BIOS-e820: 0000000000100000 - 00000000bd94d000 (usable)
[    0.000000]  BIOS-e820: 00000000bd94d000 - 00000000bd99c000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bd99c000 - 00000000bd9a6000 (ACPI data)
[    0.000000]  BIOS-e820: 00000000bd9a6000 - 00000000bdade000 (reserved)
[    0.000000]  BIOS-e820: 00000000bdade000 - 00000000bdaef000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bdaef000 - 00000000bdb02000 (reserved)
[    0.000000]  BIOS-e820: 00000000bdb02000 - 00000000bdb04000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bdb04000 - 00000000bdb0d000 (reserved)
[    0.000000]  BIOS-e820: 00000000bdb0d000 - 00000000bdb13000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bdb13000 - 00000000bdb75000 (reserved)
[    0.000000]  BIOS-e820: 00000000bdb75000 - 00000000bdd78000 (ACPI NVS)
[    0.000000]  BIOS-e820: 00000000bdd78000 - 00000000bdf00000 (usable)
[    0.000000]  BIOS-e820: 00000000fec00000 - 00000000fec01000 (reserved)
[    0.000000]  BIOS-e820: 00000000fec10000 - 00000000fec11000 (reserved)
[    0.000000]  BIOS-e820: 00000000fec20000 - 00000000fec21000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed00000 - 00000000fed01000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed61000 - 00000000fed71000 (reserved)
[    0.000000]  BIOS-e820: 00000000fed80000 - 00000000fed90000 (reserved)
[    0.000000]  BIOS-e820: 00000000fef00000 - 0000000100000000 (reserved)
[    0.000000]  BIOS-e820: 0000000100001000 - 000000043f000000 (usable)
[    0.000000] e820 update range: 0000000000000000 - 0000000000010000 (usable) ==> (reserved)
[    0.000000] e820 update range: 00000000bdf00000 - 000000043f000000 (usable) ==> (reserved)
[    0.000000] update e820 for mtrr
# 

편집 3/4 - 부분적인 성공:

  • UEFI BIOS를 버전에서 다음 버전으로 업그레이드해도 0705 x64 08/23/2011도움 1007 02/10/2012이 되지 않았습니다. 똑같은 문제가 남아 있습니다.
  • DIMM 모듈 하나를 제거하면(어느 슬롯이 CPU에서 가장 먼 #4인지 운 좋게 추측했습니다) BIOS가 나머지 24GB를 감지하고 사용할 수 있었습니다. 그러나 3-DIMM 구성은 다음과 같이 "권장"되지 않습니다. 사용자 설명서의 다이어그램. 특히, 슬롯 #4에 나머지 DIMM 중 하나를 장착해도 여전히 사용할 수 있으므로 슬롯은 괜찮습니다. "원래" DIMM을 해당 슬롯에 다시 장착하면 시작 지점으로 되돌아가게 됩니다.
  • Debian 6.0.3 AMD64 설치 CD에서 복구 환경으로 부팅하고 dmesg출력을 확인하면 다음이 표시됩니다.유사한 MTRR 오류 없음. 또한 해당 환경에서는 3 x 8GB가 설치된 경우 24GB(플러스 또는 마이너스 엡실론 곱하기 pi 정도, 정확한 계산은 하지 않음)가 에 따라 사용 가능한 것으로 표시됩니다 free.
  • 커널을 업그레이드/재설치하면(마이너 업그레이드가 가능함) MTRR 문제도 해결된 것 같습니다. dmesg이제 총 26198016KB를 보고하고 MTRR 오류는 없습니다. 이는 3 x 8GB가 설치된 경우 예상되는 것과 일치합니다. free -m이제 총 RAM이 24114MB로 보고되는데, 이는 솔직히 나에게 충분히 근접한 수치입니다.

이것은 벗겨진 DIMM 냄새와 어떤 이유로든 손상된 커널 냄새가 납니다. 후자5월정전 중에 발생했습니다(커널이 깨지는 이상한 방법이라고 말해야 하겠지만!). 작동하지 않는 DIMM은 제가 연락하는 대로(아마도 내일) 리셀러에게 돌아갈 것입니다.

(희망적으로) 최종 편집

두 쌍의 DIMM 중 하나를 RMA했는데 리셀러가 손상된 것으로 확인하고 새 쌍을 보냈는데 제대로 작동하는 것 같습니다. 그래서 저는 기본적으로 거의 한 달 전에 원래 의도했던 위치에 있으며(그 시간의 상당 부분이 실제로 리셀러로 인한 것은 아니었지만) 32GB RAM을 사용할 수 있습니다. free -m총 메모리는 32194MB이고 커널은 34586624k초기화 시 RAM을 보고합니다. 두 가지 모두 내 기대와 잘 일치합니다.

답변1

첫째, BIOS/UEFI가 RAM을 올바르게 감지하지 못하면 OS가 더 이상 성능을 발휘하지 못할 것입니다. BIOS가 설정에 대해 잘못된 정보를 표시하는 경우 더 이상 진행할 필요가 없습니다.

=> 아마도 당신은적어도하드웨어 문제.

편집하다: 귀하의 dmesg에서 | grep 메모리, 당신이 가지고있는 것 같습니다사실은임베디드 BIOS에 있는 하드웨어 문제입니다. 적어도 Linux는 이를 감지하고 이에 대해 경고합니다 WARNING: BIOS bug: CPU MTRRs don't cover all of memory, losing 13295MB of RAM. 또한 4개의 RAM 모듈 중 하나가 잘못 인식되거나 삽입된 것 같습니다.

제조업체에 보고하고, BIOS를 업그레이드하고, 마더보드를 변경할 수 있습니다. RAM이 적으면 이 버그가 발생하지 않을 가능성이 많습니다.

참고로, 당신은 다음의 유명한 인용문에 동의할 것입니다.BIOS 제조업체에 대한 Linus Torvalds:

BIOS 작성자는 언제나 완전히 무능한 크랙에 중독된 원숭이입니다.

둘째, BIOS가 실제로 마더보드에 있는 것과 일치하면 에서 Linux를 살펴볼 수 있습니다 /proc/meminfo. Linux 시스템이 메모리로 무엇을 알고 무엇을 하는지는 매우 명확합니다. 내 64비트/8GB RAM에 있는 내용은 다음과 같습니다.

$ cat /proc/meminfo 
MemTotal:        8175652 kB
MemFree:         5476336 kB
Buffers:           63924 kB
Cached:          1943460 kB
SwapCached:            0 kB
[...]

부팅 프로세스와 Linux 커널에서 사용/해제되는 내용에 대해서는 다음에서 grep할 수 있습니다 dmesg.

$ dmesg | grep Memory
[    0.000000] Memory: 8157672k/8904704k available (6138k kernel code, 534168k absent, 212864k reserved, 6896k data, 988k init)

편집하다: Gilles가 말했듯이 를 사용하면 dmidecode --type memory하드웨어 구성에 대한 세부 정보를 얻을 수 있습니다. 4x2Gb 시스템의 경우 다음과 같습니다.

$ sudo dmidecode --type memory
# dmidecode 2.9
SMBIOS 2.6 present.

Handle 0x0020, DMI type 16, 15 bytes
Physical Memory Array
    Location: System Board Or Motherboard
    Use: System Memory
    Error Correction Type: None
    Maximum Capacity: 32 GB
    Error Information Handle: Not Provided
    Number Of Devices: 4

Handle 0x0022, DMI type 17, 28 bytes
Memory Device
    Array Handle: 0x0020
    Error Information Handle: Not Provided
    Total Width: 64 bits
    Data Width: 64 bits
    Size: 2048 MB
    [...]
[This block is repeated for each module]

답변2

/var/log/dmesg에서 메모리 맵('e820'의 경우 grep)을 검색하고 사용 가능한 것으로 보고된 메모리 수를 계산합니다. 이는 BIOS가 메모리용으로 로드된 OS에 지시하는 것입니다.

(이것은 구식 부팅에만 해당됩니다. EFI 스타일 부팅을 사용하면 메모리가 어떻게 보고되는지는 모르겠지만 비슷한 보고가 있는 것 같습니다.)

또한 32GB가 설치된 상태에서 BIOS가 16GB를 보고한다는 것은 메모리 설정에 이상한 점이 있음을 의미합니다. 설치된 메모리를 4GB 또는 8GB로 줄이고 효과를 비교해 보세요.

답변3

많은 구형 AMD 보드에는 4개의 슬롯이 있을 수 있지만 마지막 슬롯을 채우면 문제가 발생합니다. 고칠 수 없는 칩셋 문제입니다.

관련 정보