VM 中的“錯誤”總記憶體
我在 VMware Fusion 10.1.1(在 High Sierra)中執行了幾個 Debian 9.3 VM,核心為 4.9.0-5-amd64。
我擔心的是,Free 中的總記憶體不能正確反映我為多個 VM 預留的記憶體。
作為測試,我為虛擬機預留了 2GB 空間,但
free -m
僅顯示 1986MB:$ 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 aprox。那麼少20MB呢?
有趣的是,在Google搜尋 MemTotal/DirectMap2M 時發現了這篇文章:Memory / Ram is wrong
如果您的作業系統通過
free –m
ortop
命令顯示錯誤的 RAM 分配,請確保您確實為您的 VPS 分配了正確數量的 RAM。只是報告是錯誤的,這是由於我們使用最新的 Xen 4.xx 版本來增強性能,不幸的是,這會導致這種異常,在 32 位作業系統模板上比其他模板更是如此。
另外請記住,更現代的核心不會向作業系統提供一些核心保留記憶體。
那麼這裡發生了什麼?是他們建議的核心保留記憶體嗎?為了什麼目的?
(是的,他們在談論 Xen,這是關於 VmWare Fusion,但這可能是一個線索)
為了補充:
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
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
顯示 32062 MiB 而不是上面給出的 32049 MiB。在您的情況下,僅保留 62MiB (2048 – 1986);這足以覆蓋核心程式碼和數據,以及一些保留的記憶體。引導日誌還將包括系統記憶體映射的詳細資訊,該映射應佔保留記憶體的大部分(它為韌體、ACPI 等保留,即使在 VM 中也是如此)。
MemTotal
從不對應於已安裝的物理記憶體量或為 VM 分配的記憶體量,這是完全正常的。