메모리 문제를 체계적으로 디버깅하고 싶습니다.
내 시스템 설정은 다음과 같습니다. 2개의 CPU(각각 다중 코어 포함)가 있는 (물리적) 서버가 있습니다. 각 CPU에는 해당 메모리 컨트롤러에 연결된 1TiB의 RAM(16개의 메모리 모듈, 각각 64GiB)이 있습니다. 따라서 시스템에는 총 2TiB RAM이 있습니다. 현재 저는 이 서버의 운영 체제로 Ubuntu 20.04를 사용하고 있습니다.
루트로 실행 하면 lsmem --output-all
다음과 같은 결과가 나타납니다.
RANGE SIZE STATE REMOVABLE BLOCK NODE ZONES
0x0000000000000000-0x00000000ffffffff 4G online yes 0-1 0 None
0x0000000100000000-0x000000fcffffffff 1008G online yes 2-505 0 Normal
0x0000010000000000-0x000001007fffffff 2G online yes 512 0 None
0x0000010080000000-0x000001ffffffffff 1022G online yes 513-1023 1 Normal
0x0000020000000000-0x000002007fffffff 2G online yes 1024 1 None
Memory block size: 2G
Total online memory: 2T
Total offline memory: 0B
보시다시피 커널은 메모리를 2GiB 청크로 "분할"하는데, 이는 이 정도 RAM 용량을 갖춘 시스템에서 예상되는 현상입니다. 그런데 1019개의 블록만 나열되어 있는 것이 이상합니다(1024개의 블록이어야 함). 노드 0(10GiB 메모리)의 5개 블록이 누락된 것 같습니다. (메모리가 2TiB인 다른 서버가 있는데 이 서버에서는 이 동작이 발생하지 않습니다.)
그 10GiB에 무슨 일이 일어났는지 알고 싶습니다. 이 메모리는 일부 장치에서 사용되지만 실행 중에는 lsmem --output-all
실제로 cat /proc/iomem
누락된 메모리 블록이 나열되지 않습니다. 마치 10GiB가 존재하지 않는 것과 같습니다.
내 질문은 다음과 같습니다.lsmem --output-all
블록(나열된 대로 )에서 물리적 메모리(예: RAM 모듈)로의 매핑을 찾는 방법이 있습니까 ? 영향을 받은 RAM 모듈을 변경하고 해당 모듈에 물리적인 문제가 있는지 확인할 수 있기 때문에 이는 매우 도움이 될 것입니다.
난 이미 시도했어자세히 살펴보면 /sys/devices/system/edac/mc
메모리 컨트롤러와 메모리 계층 구조를 찾았지만 메모리가 어떤 블록에 매핑되어 있는지는 찾지 못했습니다.
답변1
전체 메모리의 일부는 시스템 자체를 위해 예약되어 있습니다. 따라서 Linux에서 볼 수 있는 사용 가능한 메모리는 남은 메모리입니다. 이 5개 블록은 시스템 예약 메모리여야 합니다.
dmidecode --type memory
설치된 실제 메모리의 양을 나열할 수 있습니다 .
sudo grep '^[^ ]' /proc/iomem
시스템에 예약된 메모리 블록을 나열할 수 있습니다 .