이슈 상황
Hypervisor에서 리눅스, 윈도우즈 VM에 동일한 메모리 사이즈로 할당하였는데 Mem Total이 다른 현상
환경
Hypervisor(ESXi/KVM 등)상의 리눅스/윈도우 VM에 각각 8G 메모리를 할당
확인 방법
- 리눅스에서 확인
[root@rhvm43 ~]# free -m total used free shared buff/cache available Mem: 7821 3006 2529 73 2285 4460 Swap: 6143 0 6143
⇒ Total 값이 7821로 확인
- 윈도우즈에서 확인
⇒ Total 값이 8191로 화인
같은 hypervisor에서 할당한 VM인데 OS에 따라 Mem Total 값이 다르게 확인된다.
원인
OS 별로 Mem Total을 표기하는 기준이 다르기 때문이다.
따라서 VM 뿐만 아니라 PM(Physical Machine)에서도 동일한 현상이 발생된다.
- Linux Mem Total 표기 기준
리눅스 서버의 Free (또는 /proc/meminfo) 에서 확인되는 Mem Total 값은 아래 메모리 공간을 제외하고 출력되는 값이다.
- page 구조를 위한 커널의 예약된 공간
- crashkernel을 위한 예약된 공간
- HW 맵핑을 위한 예약된 공간 (CPU/Mem Numa Node 등을 위한) - Windows Mem Total 표기 기준
리눅스와 달리 Mem Total에 H/W 예약공간만 제외하고 기타 커널을 위한 공간을 포함하여 표기함
리눅스 메모리 확인 방법
실제 설치된 메모리
- 가상머신에서 확인 시
[root@rhvm43 ~]# dmidecode --type memory | grep -e '^\sSize' | grep -v 'No Module Installed' Size: 8192 MB
가상 머신의 경우, 가상화 특성상 단일 메모리 Module 구조이므로 위와 같이 확인 시 한 줄만 출력될 것이다.
- 물리머신에서 확인 시
[root@pyhost ~]# dmidecode --type memory | grep -e '^\sSize' | grep -v 'No Module Installed' Size: 2048 MB Size: 2048 MB
물리 머신의 경우, DIMM에 Memory가 꽂아진 수에 따라 여러개의 출력값이 확인 될 것이다. 이것을 합산한 값이 실제 설치된 메모리 값이다.
위 시스템은 2G 메모리 2개를 설치하여 총 4G 메모리를 보유한 상태이다. - 또는 다음과 같이 확인 가능
[root@pyhost ~]# dmidecode -t 17 | grep "Size.*MB" Size: 2048 MB Size: 2048 MB
⇒ 위와 동일한데 -t 17 옵션 (type 17 : Memory Device)을 통해 출력
[root@pyhost ~]# dmidecode -t 17 | grep "Size.*MB" | awk '{s+=$2} END {print s / 1024 "GB"}' 4GB
⇒ 출력 라인을 모두 합산하여 Gigabyte 단위로 출력. 가상/물리 머신 모두 이 방법을 통해 출력하면 될 것이다.
# dmidecode --type memory | grep -e '^\sSize' | grep -v 'No Module Installed' | awk '{s+=$2} END {print s "GB"}' 384GB # dmidecode -t 17 | grep "Size.*GB" | grep -v Vol| awk '{s+=$2} END {print s "GB"}' 384GB
⇒ 대용량의 메모리가 설치된 서버는 출력된 값이 GB이므로 위와 같이 수행
예약된 메모리
- 가상/물리 머신 모두 동일하게 아래와 같이 확인 가능함
[root@rhvm43 ~]# dmesg | grep -i reserv [ 0.000000] BIOS-e820: [mem 0x000000000009f400-0x000000000009ffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000000dc000-0x00000000000fffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000f0000000-0x00000000f7ffffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fec00000-0x00000000fec0ffff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved [ 0.000000] BIOS-e820: [mem 0x00000000fffe0000-0x00000000ffffffff] reserved [ 0.000000] e820: update [mem 0x00000000-0x00000fff] usable ==> reserved [ 0.000000] e820: update [mem 0xc0000000-0xffffffff] usable ==> reserved [ 0.000000] Reserving 161MB of memory at 688MB for crashkernel (System RAM: 8191MB) [ 0.000000] DMA zone: 21 pages reserved [ 0.000000] Memory: 4972224k/9437184k available (7784k kernel code, 1049096k absent, 402420k reserved, 5957k data, 1980k init) [ 0.189811] PCI: MMCONFIG at [mem 0xf0000000-0xf7ffffff] reserved in E820 [ 0.369071] e820: reserve RAM buffer [mem 0x0009f400-0x0009ffff] [ 0.369073] e820: reserve RAM buffer [mem 0xbfee0000-0xbfffffff] [ 0.375172] system 00:00: [io 0x1000-0x103f] could not be reserved [ 0.375174] system 00:00: [io 0x1040-0x104f] has been reserved [ 0.375176] system 00:00: [io 0x0cf0-0x0cf1] has been reserved [ 0.375366] system 00:04: [mem 0xfed00000-0xfed003ff] has been reserved [ 0.376458] system 00:05: [io 0xfce0-0xfcff] has been reserved [ 0.376461] system 00:05: [mem 0xf0000000-0xf7ffffff] has been reserved [ 0.376462] system 00:05: [mem 0xfe800000-0xfe9fffff] has been reserved
결론
이것은 OS의 Mem Total 표기법의 차이일 뿐 실제 OS별로 인식하는 설치된 메모리 사이즈는 차이가 없다.
[참조문서]
- Why MemTotal (and free total) don't match the actual RAM value of real configured memory
https://access.redhat.com/solutions/3006511
https://access.redhat.com/solutions/3006511
- What are the main uses of the reserved memory in dmesg mapping.
https://access.redhat.com/solutions/59723
https://access.redhat.com/solutions/59723
Linux - Why MemTotal not same the actual RAM value of real installed memory