编辑
2026-09-03
云服务器
0
请注意,本文编写于 56 天前,最后修改于 56 天前,其中某些信息可能已经过时。

目录

问题现象
分析
总结

问题现象

今天在忽然发现2C4G的腾讯云服务器内存显示3.6GB

可恶的腾讯,悄咪咪的把我的内存偷走了,今天偷我0.4G,明天不敢想会干什么,,,,,,

bash
root@wxh-server:~# free -gh total used free shared buff/cache available Mem: 3.6Gi 1.0Gi 298Mi 3.0Mi 2.3Gi 2.3Gi Swap: 0B 0B 0B root@wxh-server:~# cat /etc/os-release PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" VERSION_CODENAME=jammy ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=jammy

分析

运维多年接触过很多虚拟化,其实有发现过类似的情况,但是没有认真研究过这个问题,今天来看看是什么情况

这种问题适合一层层去排查,肯定是哪个环节占用了大概0.4G左右

1, bios层

虚拟机的bios是模拟的,你把握不住

通过下面的命令可以看到 Size:4 GB ,说明从虚拟化层面是一点也没少给的,合理

bash
root@wxh-server:~# dmidecode -t memory # dmidecode 3.3 Getting SMBIOS data from sysfs. SMBIOS 2.8 present. Handle 0x1000, DMI type 16, 23 bytes Physical Memory Array Location: Other Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 4 GB Error Information Handle: Not Provided Number Of Devices: 1 Handle 0x1100, DMI type 17, 40 bytes Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: Unknown Data Width: Unknown Size: 4 GB Form Factor: DIMM Set: None Locator: DIMM 0 Bank Locator: Not Specified Type: RAM Type Detail: Other Speed: Unknown Manufacturer: Smdbmds Serial Number: Not Specified Asset Tag: Not Specified Part Number: Not Specified Rank: Unknown Configured Memory Speed: Unknown Minimum Voltage: Unknown Maximum Voltage: Unknown Configured Voltage: Unknown

2,系统层 这层面信息量就很大了,一点点来看

ACPI 固件提示内核把这块物理内存保留,不给应用使用。合理

  • FACP:ACPI 核心配置表,电源管理、关机、休眠参数都在这里。
  • DSDT:ACPI 设备描述表,描述虚拟硬件 (网卡、磁盘),这块内存锁住保留。
  • FACS,用于 S3 睡眠唤醒的固件内存区域,保留。
  • APIC:多核中断控制器配置表,KVM 虚拟机多核 CPU 中断配置。
  • SRAT:NUMA 内存亲和表,腾讯云虚拟机 NUMA 相关。
  • 这些加起来也就10KB左右

crashkernel 占用192MB,听名字是内核崩溃之类的。合理

  • 可以看情况可以回收,在grub里有显示
bash
root@wxh-server:~# cat /proc/cmdline BOOT_IMAGE=/boot/vmlinuz-5.15.0-171-generic root=UUID=7bccaefa-b039-4ff6-bd32-22dde0066c0b ro net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5 intel_idle.max_cstate=1 intel_pstate=disable processor.max_cstate=1 crashkernel=0M-3G:0M,3G-8G:192M,8G-16G:256M,16G-64G:384M,64G-128G:512M,128G-486G:768M,486G-972G:1024M,972G-:2048M

系统RAM是4031MB,讲道理应该是4096MB的,中间少了4096-4031=65MB,这不合理吧

通过一番查询可能是bios本身占用的,系统启动前就给占了

  • 物理机的bios配置默认是在主板上的只读芯片falsh rom里的
  • 虚拟机默认没芯片,所以占用了,主要存储bios固件呀等信息

别的信息大概就是启动过程中初始化系统的内存情况,以下两点比较重要

  • 系统启动过程中可用内存比free 显示的要少,大概率是启动后又释放了
  • 内存在这个过程中被分成128MB大小的块被各个进程使用
bash
root@wxh-server:~# dmesg | grep -i memory [ 0.003488] ACPI: Reserving FACP table memory at [mem 0xbffe2639-0xbffe26ac] [ 0.003490] ACPI: Reserving DSDT table memory at [mem 0xbffe0040-0xbffe2638] [ 0.003491] ACPI: Reserving FACS table memory at [mem 0xbffe0000-0xbffe003f] [ 0.003492] ACPI: Reserving APIC table memory at [mem 0xbffe26ad-0xbffe272c] [ 0.003493] ACPI: Reserving SRAT table memory at [mem 0xbffe272d-0xbffe27f4] [ 0.003897] Reserving 192MB of memory at 2864MB for crashkernel (System RAM: 4031MB) [ 0.003921] Early memory node ranges [ 0.012498] PM: hibernation: Registered nosave memory: [mem 0x00000000-0x00000fff] [ 0.012500] PM: hibernation: Registered nosave memory: [mem 0x0009f000-0x000fffff] [ 0.012501] PM: hibernation: Registered nosave memory: [mem 0xbffde000-0xffffffff] [ 0.024412] Memory: 3625288K/4128240K available (16393K kernel code, 4399K rwdata, 10996K rodata, 3292K init, 18772K bss, 502692K reserved, 0K cma-reserved) [ 0.196058] Freeing SMP alternatives memory: 44K [ 0.325518] x86/mm: Memory block size: 128MB [ 1.350769] Freeing initrd memory: 109320K [ 1.430819] Freeing unused decrypted memory: 2036K [ 1.432341] Freeing unused kernel image (initmem) memory: 3292K [ 1.435096] Freeing unused kernel image (text/rodata gap) memory: 2036K [ 1.436486] Freeing unused kernel image (rodata/data gap) memory: 1292K

总结

1,内存并没有丢失,只是在虚拟化和系统层面被占用了,真是错怪腾讯了😓 2,free展示的就是proc/meminfo里面的内存信息

以下是大概的流程和丢失的部分,手动能搞得就是内核转储,关闭了可以获得将近200MB内存

bash
4.0GB 物理内存 ↓ (BIOS预留64MB) 4.0GB 可用内存 ↓ (内核启动分配) 开机日志:3.47GB可用,4.0GB总内存 ↓ (系统启动预留491MB) 实际运行:3.47GB可用 ↓ (系统启动完成优化) free -h:3.6GB总内存 # 0.4G丢失部分 - bios相关:65MB (虚拟BIOS等) - crashkernel: 192MB (Linux内核崩溃转储) #可回收 - ACPI表: ~1MB (ACPI硬件配置表) - nosave内存: ~1MB (休眠机制) - 其他预留: ~150MB (内存管理结构)

本文作者:油炸臭豆腐

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!