서버에서 Linux 커널은 부팅 시 RAM 설정을 알립니다. 이는 물리적 512GiB RAM(536409480kiB) 중 약 503GiB RAM(527942676kiB)만 사용할 수 있음을 보여줍니다.
root@ada:~# dmesg | grep Memory:
[ 5.891484] Memory: 527942676K/536409480K available (10252K kernel code, 1241K rwdata, 3320K rodata, 1592K init, 2272K bss, 8466804K reserved, 0K cma-reserved)
BIOS가 예약한 IO 영역을 고려하면 일부 메모리를 사용할 수 없을 것으로 예상됩니다.
root@ada:~# dmesg | grep reserved
[ 0.000000] BIOS-e820: [mem 0x000000000009c000-0x000000000009ffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000000e0000-0x00000000000fffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000004f66f000-0x0000000057677fff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000006cdcf000-0x000000006efcefff] reserved
[ 0.000000] BIOS-e820: [mem 0x0000000070000000-0x000000008fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x00000000e0000000-0x00000000ffffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000107f380000-0x000000107fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000207ff80000-0x000000207fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000307ff80000-0x000000307fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000407ff80000-0x000000407fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000507ff80000-0x000000507fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000607ff80000-0x000000607fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000707ff80000-0x000000707fffffff] reserved
[ 0.000000] BIOS-e820: [mem 0x000000807ff80000-0x000000807fffffff] reserved
그러나 총 크기는 100MiB를 초과하지 않습니다.
이 메모리가 예약되는 원인을 어떻게 조사할 수 있는지 궁금합니다. 이유는 무엇입니까?
예약된 메모리가 어떤 용도로 사용되는지 이해하지 못하면 ~9GiB의 메모리 손실처럼 보입니다. 시스템이 가상화 호스트 역할을 한다는 점을 고려하면 각 가상화 게스트 시스템이 차례로 전용 RAM의 유사한 부분을 "예약"하기 때문에 이러한 "손실"은 더욱 악화됩니다.
~부터다른 문제누군가 그러한 메모리가 그래픽 카드의 "공유 메모리"용으로 예약될 수 있다고 제안했는데, 찾아봤지만 현재 어댑터는 최대 50MiB만 사용하는 것 같습니다.
root@ada:~# lspci | grep -i vga
03:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. Integrated Matrox G200eW3 Graphics Controller (rev 04)
root@ada:~# lspci -s 03:00.0 -vvv
03:00.0 VGA compatible controller: Matrox Electronics Systems Ltd. Integrated Matrox G200eW3 Graphics Controller (rev 04) (prog-if 00 [VGA controller])
Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-
Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-
Latency: 0 (4000ns min, 8000ns max)
Interrupt: pin A routed to IRQ 243
NUMA node: 0
Region 0: Memory at eb000000 (32-bit, prefetchable) [size=16M]
Region 1: Memory at f9808000 (32-bit, non-prefetchable) [size=16K]
Region 2: Memory at f9000000 (32-bit, non-prefetchable) [size=8M]
[virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
Capabilities: [dc] Power Management version 3
Flags: PMEClk- DSI+ D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)
Status: D0 NoSoftRst- PME-Enable- DSel=0 DScale=0 PME-
Kernel driver in use: mgag200
Kernel modules: mgag200
고쳐 쓰다
여기완전한 dmesg 출력입니다
고쳐 쓰다 BIOS 모드(비 UEFI)로 부팅된 Dell Poweredge 서버입니다.
고쳐 쓰다
이것이 출력이다/proc/iomem
고쳐 쓰다
여기서 평가된 출력/proc/iomem
root@ada:~# cat /proc/iomem | tr [a-z] [A-Z] | while IFS='-: ' read AD1 AD2 REST;
> do echo "$(( $(echo "obase=10; ibase=16; ( $AD2 - $AD1 ) " | bc) >> 20))MB for $REST" ;
> done | sort -h
[...]
14MB for ACPI NON-VOLATILE STORAGE
15MB for 0000:03:00.0
15MB for MGADRMFB_VRAM
15MB for PCI BUS 0000:02
15MB for PCI BUS 0000:03
33MB for RESERVED
128MB for RESERVED
207MB for PCI BUS 0000:20
207MB for PCI BUS 0000:40
207MB for PCI BUS 0000:60
207MB for PCI BUS 0000:80
207MB for PCI BUS 0000:A0
207MB for PCI BUS 0000:C0
207MB for PCI BUS 0000:E0
255MB for PCI MMCONFIG 0000 [BUS 00-FF]
255MB for PNP 00:00
315MB for PCI BUS 0000:00
343MB for SYSTEM RAM
511MB for RESERVED
543MB for RESERVED
1269MB for SYSTEM RAM
63475MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
65535MB for SYSTEM RAM
915967MB for PCI BUS 0000:00
915967MB for PCI BUS 0000:20
915967MB for PCI BUS 0000:40
915967MB for PCI BUS 0000:60
915967MB for PCI BUS 0000:80
915967MB for PCI BUS 0000:A0
915967MB for PCI BUS 0000:C0
915967MB for PCI BUS 0000:E0
내 시스템의 dmidecode 출력은 다음과 같습니다(RAM 가용성 상황에 맞게).
Getting SMBIOS data from sysfs.
SMBIOS 3.2 present.
81 structures occupying 6778 bytes.
Table at 0x6E8AD000.
Handle 0xDA00, DMI type 218, 11 bytes
OEM-specific Type
Header and Data:
DA 0B 00 DA B2 00 17 20 0E 10 03
Handle 0x0000, DMI type 0, 26 bytes
BIOS Information
Vendor: Dell Inc.
Version: 1.14.3
Release Date: 07/17/2020
Address: 0xF0000
Runtime Size: 64 kB
ROM Size: 0 MB
Characteristics:
ISA is supported
PCI is supported
PNP is supported
BIOS is upgradeable
BIOS shadowing is allowed
Boot from CD is supported
Selectable boot is supported
EDD is supported
Japanese floppy for Toshiba 1.2 MB is supported (int 13h)
5.25"/360 kB floppy services are supported (int 13h)
5.25"/1.2 MB floppy services are supported (int 13h)
3.5"/720 kB floppy services are supported (int 13h)
8042 keyboard services are supported (int 9h)
Serial services are supported (int 14h)
CGA/mono video services are supported (int 10h)
ACPI is supported
USB legacy is supported
BIOS boot specification is supported
Function key-initiated network boot is supported
Targeted content distribution is supported
UEFI is supported
BIOS Revision: 1.14
Handle 0x0100, DMI type 1, 27 bytes
System Information
Manufacturer: Dell Inc.
Product Name: PowerEdge R7425
Version: Not Specified
Serial Number: XXXXXX
UUID: XXXXXXXX-XXXX-4a10-8048-c3c04f593533
Wake-up Type: Power Switch
SKU Number: SKU=NotProvided;ModelName=PowerEdge R7425
Family: PowerEdge
전체 dmidecode 및 약 9GiB RAM의 불가사의한 사용 불가능에 대한 가능한 정보는 여기에서 볼 수 있습니다.https://pastebin.com/nHYyuH7h
답변1
나는 답을 알고 있다고 생각합니다(하지만 100% 확실하지는 않습니다).
struct page
Linux에는 메모리 페이지와 관련된 구조가 있습니다 . 구조의 크기는 아키텍처마다 다릅니다. 32비트 x86 Linux에서는 40바이트이고, 64비트에서는 더 큰 포인터 크기로 인해 64바이트라고 생각됩니다.
여기에서 찾을 수 있습니다: https://elixir.bootlin.com/linux/v6.1/source/include/linux/mm_types.h
이러한 구조는 다양한 방식으로 구성될 수 있습니다(참조:https://lwn.net/Articles/789304/), 그러나 결국에는 시스템의 모든 메모리 페이지가 그러한 구조를 갖게 됩니다.
즉, 커널은 4096바이트(페이지 크기)마다 64바이트를 예약해야 하며, 이는 512G의 경우 ((512×1024³)/4096)×64 = 8589934592바이트 또는 8388608K(8G)를 예약한다는 의미입니다.
이를 코드 ro/rwdata, init, bss 섹션에 추가하면 여기서 설명하려는 8466804K에 매우 가까운 8407285K를 얻게 됩니다.
mem=256G
커널 매개변수 등을 사용하여 서버를 시작할 수도 있습니다. 이렇게 하면 사용 가능한 메모리 크기가 256G로 제한되고 예약된 크기가 거의 2배로 줄어드는 것을 볼 수 있습니다. 이는 위의 이론과도 관련이 있습니다. 불행하게도 해당 구조에 정보가 얼마나 많이 들어 있고 그만큼 중요한지를 고려할 때 해당 메모리를 다른 용도로 사용할 수 있는 방법은 없습니다.