가상 머신의 "잘못된" 총 메모리

가상 머신의 "잘못된" 총 메모리

저는 커널 4.9.0-5-amd64를 사용하는 VMware Fusion 10.1.1(High Sierra)에서 여러 Debian 9.3 가상 머신을 실행하고 있습니다.

제가 우려하는 점은 Free의 총 메모리가 여러 VM에 대해 따로 설정한 메모리를 올바르게 반영하지 않는다는 것입니다.

테스트로 가상 머신용으로 2GB를 예약했지만 free -m1986MB만 표시됩니다.

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1986          51        1864           1          70        1825

아니면 -m:

$ free 
              total        used        free      shared  buff/cache   available
Mem:        2033760       52264     1909584        1108       71912     1869628
Swap:        999420           0      999420

또한 디버깅 상황을 살펴본 결과 /proc/meminfo다음과 같은 사실을 발견했습니다.

$ egrep "MemTotal|DirectMap2M" /proc/meminfo
MemTotal:        2033760 kB
DirectMap2M:     2054144 kB

따라서 실제로 DirectMap2M은 2GB를 반영합니다. MemTotal이 약 2GB를 갖는 이유는 다음과 같습니다. 그러면 20MB가 적나요?

흥미롭게도 Google에서 MemTotal/DirectMap2M을 검색하면 다음 기사가 발견되었습니다.메모리/램 오류

운영 체제가 free –m또는 명령을 통해 top잘못된 RAM 할당을 표시하는 경우 실제로 VPS에 올바른 양의 RAM을 할당했는지 확인하십시오.

이것은 단지 잘못된 보고입니다. 이는 성능 향상을 위해 최신 Xen 4.xx 버전을 사용하고 있기 때문입니다. 이로 인해 특히 32비트 OS 템플릿에서 이러한 예외가 발생할 수 있습니다.

또한 최신 커널은 일부 커널 예약 메모리를 운영 체제에 제공하지 않는다는 점을 명심하십시오.

그럼 여기서 무슨 일이 일어나고 있는 걸까요? 권장대로 메모리를 예약하는 커널입니까? 무슨 목적을 위해?
(예, VmWare Fusion에 관한 Xen에 대해 이야기하고 있지만 이것이 단서가 될 수 있습니다.)

보충하는 데 사용:

vmstat 출력:

$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 1909344  13988  57928    0    0    31     0   19   37  0  0 100  0  0

최고 출력:

$ top -b -n 1 | grep Mem
KiB Mem :  2033760 total,  1906228 free,    52836 used,    74696 buff/cache
KiB Swap:   999420 total,   999420 free,        0 used.  1867664 avail Mem 

dmidecode출력(부분);

Handle 0x0085, DMI type 6, 12 bytes
Memory Module Information
        Socket Designation: RAM socket #0
        Bank Connections: None
        Current Speed: Unknown
        Type: EDO DIMM
        Installed Size: 2048 MB (Single-bank Connection)
        Enabled Size: 2048 MB (Single-bank Connection)
        Error Status: OK

출력 dmesg:

$ sudo dmesg | egrep "Memory|Free|ACPI" | egrep -v "edge|wakeup|noapic|Added|Bug|IRQ|pnp|Plug"
[    0.000000] BIOS-e820: [mem 0x000000007fee0000-0x000000007fefefff] ACPI data
[    0.000000] BIOS-e820: [mem 0x000000007feff000-0x000000007fefffff] ACPI NVS
[    0.000000] ACPI: Early table checksum verification disabled
[    0.000000] ACPI: RSDP 0x00000000000F6A10 000024 (v02 PTLTD )
[    0.000000] ACPI: XSDT 0x000000007FEEB683 00005C (v01 INTEL  440BX    06040000 VMW  01324272)
[    0.000000] ACPI: FACP 0x000000007FEFEE73 0000F4 (v04 INTEL  440BX    06040000 PTL  000F4240)
[    0.000000] ACPI: DSDT 0x000000007FEEC923 012550 (v01 PTLTD  Custom   06040000 MSFT 03000001)
[    0.000000] ACPI: FACS 0x000000007FEFFFC0 000040
[    0.000000] ACPI: FACS 0x000000007FEFFFC0 000040
[    0.000000] ACPI: BOOT 0x000000007FEEC8FB 000028 (v01 PTLTD  $SBFTBL$ 06040000  LTP 00000001)
[    0.000000] ACPI: APIC 0x000000007FEEC1B9 000742 (v01 PTLTD  ? APIC   06040000  LTP 00000000)
[    0.000000] ACPI: MCFG 0x000000007FEEC17D 00003C (v01 PTLTD  $PCITBL$ 06040000  LTP 00000001)
[    0.000000] ACPI: SRAT 0x000000007FEEB77F 000880 (v02 VMWARE MEMPLUG  06040000 VMW  00000001)
[    0.000000] ACPI: HPET 0x000000007FEEB747 000038 (v01 VMWARE VMW HPET 06040000 VMW  00000001)
[    0.000000] ACPI: WAET 0x000000007FEEB71F 000028 (v01 VMWARE VMW WAET 06040000 VMW  00000001)
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] ACPI: SRAT: Node 0 PXM 0 [mem 0x00000000-0x0009ffff]
[    0.000000] ACPI: SRAT: Node 0 PXM 0 [mem 0x00100000-0x7fffffff]
[    0.000000] ACPI: PM-Timer IO Port: 0x1008
[    0.000000] ACPI: Local APIC address 0xfee00000
[    0.000000] Using ACPI for processor (LAPIC) configuration information
[    0.000000] ACPI: HPET id: 0x8086af01 base: 0xfed00000
[    0.000000] Memory: 2011544K/2096628K available (6196K kernel code, 1159K rwdata, 2848K rodata, 1408K init, 688K bss, 85084K reserved, 0K cma-reserved)
[    0.005465] ACPI: 1 ACPI AML tables successfully acquired and loaded
[    0.005475] ACPI: setting ELCR to 0200 (from 0e80)
[    0.044362] x86/mm: Memory block size: 128MB
[    0.046853] PM: Registering ACPI NVS region [mem 0x7feff000-0x7fefffff] (4096 bytes)
[    0.170037] ACPI: PCI Root Bridge [PCI0] (domain 0000 [bus 00-7f])
[    0.178855] pci 0000:00:07.3: quirk: [io  0x1000-0x103f] claimed by PIIX4 ACPI
[    0.282772] ACPI: Enabled 2 GPEs in block 00 to 0F
[    0.995687] Freeing initrd memory: 17572K
[    1.085789] Freeing unused kernel memory: 1408K
[    1.085832] Freeing unused kernel memory: 1980K
[    1.085873] Freeing unused kernel memory: 1248K

전체 /proc/meminfo출력:

$ cat /proc/meminfo 
MemTotal:        2033760 kB
MemFree:         1906864 kB
MemAvailable:    1868300 kB
Buffers:           14720 kB
Cached:            50220 kB
SwapCached:            0 kB
Active:            45004 kB
Inactive:          28204 kB
Active(anon):       8308 kB
Inactive(anon):     1064 kB
Active(file):      36696 kB
Inactive(file):    27140 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        999420 kB
SwapFree:         999420 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:          8284 kB
Mapped:            14860 kB
Shmem:              1108 kB
Slab:              23996 kB
SReclaimable:       9756 kB
SUnreclaim:        14240 kB
KernelStack:        3052 kB
PageTables:         1348 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2016300 kB
Committed_AS:      38852 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       42880 kB
DirectMap2M:     2054144 kB
DirectMap1G:           0 kB

답변1

free등은 /proc/meminfo사용자 공간에서 실제로 사용할 수 있는 메모리만 표시합니다. 커널은 자체 사용을 위해 일부 메모리를 따로 설정합니다. Memory:시작 로그에서 한 줄( /var/log/dmesg.0또는 이와 유사한 것 또는 )을 보면 journalctl다음과 같은 내용을 볼 수 있습니다.

Memory: 32818828K/33439808K available (5612K kernel code, 1083K rwdata, 1896K rodata, 1264K init, 832K bss, 620980K reserved, 0K cma-reserved)

초기화에 사용된 메모리 중 일부가 시스템에 반환되고 예약된 메모리의 양이 변경될 수 있으므로 시작 후 사용 가능한 메모리 양은 일반적으로 여기에 표시된 양보다 약간 큽니다(예를 들어통합 GPU용으로 예약된 경우) 제 경우에는 MemTotal위에 제공된 32049MiB 대신 32062MiB가 표시되었습니다.

귀하의 경우에는 62MiB(2048 - 1986)만 예약되어 있습니다. 이는 커널 코드와 데이터 및 일부 예약된 메모리를 포함하기에 충분합니다. 부팅 로그에는 예약된 메모리의 대부분을 차지하는 시스템 메모리 맵의 세부 정보도 포함됩니다(가상 머신에서도 펌웨어, ACPI 등을 위해 예약되어 있음).

MemTotal가상 머신에 설치되거나 할당된 물리적 메모리의 양과 일치하지 않습니다.이것은 정상입니다.

답변2

@StephenKitt의 답변을 보완하여 MemTotal사용 가능한 전체 RAM의 값이 아님을 확인합니다.

커널 소스 코드에서,Documentation/filesystems/proc.txt

MemTotal - 사용 가능한 총 메모리 양(예: 물리적 메모리에서 일부 예약된 비트 및 커널 바이너리 코드를 뺀 값)

또한 시작 시 다음이 수행됩니다 x86/boot/compressed/kaslr.c.

enum mem_avoid_index {
    MEM_AVOID_ZO_RANGE = 0,
    MEM_AVOID_INITRD,
    MEM_AVOID_CMDLINE,
    MEM_AVOID_BOOTPARAMS,
    MEM_AVOID_MEMMAP_BEGIN,
    MEM_AVOID_MEMMAP_END = MEM_AVOID_MEMMAP_BEGIN + MAX_MEMMAP_REGIONS - 1,
    MEM_AVOID_MAX,
};

관련 정보