我有两个 t3.micro AWS 实例。一个位于 us-east-1a,另一个位于 us-east-1b。每台机器都应该有 1GB 的内存。在 us-east-1a 的第一个机器上,我看到:
[root@ip-10-0-0-32 ~]# free -m
total used free shared buff/cache available
Mem: 663 392 78 24 192 118
Swap: 4095 704 3391
[root@ip-10-0-0-32 ~]#
在 us-east-1b 的盒子上我看到
Swap: 0 0 0
[root@ip-10-0-1-32 ~]# free -m
total used free shared buff/cache available
Mem: 780 516 72 80 191 71
Swap: 0 0 0
[root@ip-10-0-1-32 ~]#
按照https://aws.amazon.com/ec2/instance-types/t3/我应该获得 1GB 的 RAM。有人能解释一下为什么我获得的 RAM 更少,以及为什么两个完全相同的实例的 RAM 大小不同吗?
答案1
这是我从 AWS 获得的答案。接下来的问题就是我能做些什么来降低内核占用空间。
来自 AWS Premium Support 的热情问候!!
我是 EC2 Linux 团队的 Prasanth,很高兴能帮助您解决这个案例。
首先,我们很抱歉回复延迟。我们最近接到大量客户支持案例,我们正在尽最大努力尽快回复每个问题。感谢您的耐心,我将继续帮助您解决您的问题。
从案例描述中,我了解到您对为什么 t3.micro 内存在操作系统级别上实际上有所不同,而在 AWS 实例类型文档中它们被列为 1 GiB 有疑问。您还想知道为什么完全相同的实例类型,一个实例比另一个实例多 120 MB 的 RAM。因此,您在观察到可用内存的差异后请求我们提供见解。如果我对您的问题有任何误解,请纠正我。
请允许我在下面的信函中逐一回答您的问题。
=> 查询 1:- 为什么我没有获得每个实例的完整 1GB 内存?
在我们继续之前,我想告诉你,这是一种预期的行为。差异在于内核为自己保留的内存(以及驱动程序保留的内存)。这通常是基于内存量的滑动比例。
这是因为内核可能会为内核空间和内存管理保留一些内存。这可能意味着诸如 top 和 free 之类的命令的输出可能不会详细地报告系统有多少内存。内核在启动时会为内存表(用于虚拟到物理地址的转换)保留一定量的内存(与其总大小成比例)。分配给内存表的这部分内存不能被其他任何东西使用,并且会从报告的总内存大小中减去。物理 RAM 越大,无法使用的内存与总物理 RAM 大小的比例就越小,对于内存较大的实例,开销在 1.56% 到 2% 之间。
这些保留的内存字节被分配给可变的内存预留。这些分配在给定系统上通常是相同的,但可能因系统不同或内核映像不同而不同。它们的大小取决于内核外部的某些因素,例如系统中的 CPU 数量或内存量,并且它们是不可回收的。大多数情况下,记为“保留”的内存被分配给 mem_map、内存 cgroup 结构、内核哈希表和特定于架构的预留。
您可以从 dmesg 或系统日志中检查保留内存信息,您会看到类似于内核:内存日志
$ sudo dmesg| grep -i 内存
或者
$ sudo cat /var/log/messages |grep -i 内存
为了进一步调试这个问题,我启动了一个类似的实例类型 t3.micro,它具有与您使用的相同 AMI(ami-0d6e9a57f6259ba3a)。
[root@test1 ~]# cat /etc/system-release
CentOS Linux release 8.2.2004 (Core)
然后我通过 free 和 /proc/meminfo 文件检查了总可用内存,我注意到可用内存约为 790 MB。
[root@test1 ~]# free -m
total used free shared buff/cache available
Mem: 790 161 259 10 369 496
Swap: 0 0 0
[root@test1 ~]#
[root@test1 ~]# grep MemTotal /proc/meminfo
MemTotal: 809644 kB
如上所述,在实例上输入“sudo dmesg | grep -i memory”,我们将看到类似以下内容:-
[root@test1 ~]# sudo dmesg | grep -i memory
[ 0.000000] kexec: Reserving the low 1M of memory for crashkernel
[ 0.000000] Reserving 160MB of memory at 624MB for crashkernel (System RAM: 995MB)
[ 0.000000] Early memory node ranges
[ 0.000000] PM: Registered nosave memory: [mem 0x00000000-0x00000fff]
[ 0.000000] PM: Registered nosave memory: [mem 0x0009f000-0x0009ffff]
[ 0.000000] PM: Registered nosave memory: [mem 0x000a0000-0x000effff]
[ 0.000000] PM: Registered nosave memory: [mem 0x000f0000-0x000fffff]
[ 0.000000] Memory: 261120K/1019488K available (12292K kernel code, 2151K rwdata, 3848K rodata, 2404K init, 6476K bss, 268068K reserved, 0K cma-reserved)
[ 0.026279] Freeing SMP alternatives memory: 32K
[ 0.047046] x86/mm: Memory block size: 128MB
[ 0.724714] Freeing initrd memory: 51480K
[ 0.868145] Non-volatile memory driver v1.3
[ 1.004205] Freeing unused decrypted memory: 2040K
[ 1.005900] Freeing unused kernel memory: 2404K
[ 1.011944] Freeing unused kernel memory: 2020K
[ 1.013098] Freeing unused kernel memory: 248K
从这个输出中您可以获得保留内存,但这也可能因操作系统和内核的不同而有所不同。
将 268068 KB 转换为 MB,因此 MB 的值为 261.78MB
因此,正如我们在官方文档中所述,t3.micro 实例的总内存为 (790 + 261.78 = 1051) ~ 1 GiB。但是,如上所述,在我的测试实例中,Linux 内核保留了大约 268068 KB。
因此,AWS 虚拟机管理程序正在为客户操作系统分配正确的内存资源,因为客户操作系统为其维护和管理目的保留了一些内存空间,而 PROC 文件系统或内存监控工具报告的可用内存较少。
=> 查询 2:- 为什么对于完全相同的实例,一个比另一个多 120MB 的 RAM。
内存保留值可能因内核和配置参数而异。
在引导过程的后期,一些内存会被释放 - 例如,initrd ramdisk。因此,它会波动 - 总值在很大程度上取决于特定系统、内核配置和其他操作系统参数。
保留结构随硬件内存的增加而增加。其中一些是用于记账的保留空间,其他是用于驱动程序分配的内存。
/proc 的内核文档对 meminfo 的 MemTotal 值有如下说明:
MemTotal: Total usable ram (i.e. physical ram minus a few reserved bits and the kernel binary code)
https://www.kernel.org/doc/Documentation/filesystems/proc.txt
话虽如此,通常来说,没有清晰的方法来预测可用的总内存量。
但是,您可以借助 lsmem 命令找到实例的总分配内存。请查看我的测试机器的以下输出以供参考。
[root@test1 ~]# lsmem
RANGE SIZE STATE REMOVABLE BLOCK
0x0000000000000000-0x000000003fffffff 1G online no 0-7
Memory block size: 128M
Total online memory: 1G <====>
Total offline memory: 0B
希望以上信息能解决您的问题。如果您对此问题有任何疑问,或者您觉得我没有澄清任何内容,请随时回复以询问其他问题或了解更多信息。我很乐意为您提供帮助。
祝您度过美好的一天并注意安全!
我们非常重视您的反馈。请使用本函件末尾的 AWS 支持中心链接对本函件进行评级,分享您的体验。您还可以通过选择 AWS 支持中心内每封函件右上角的星号对每封函件进行评级。
此致敬礼,Prasanth R. Amazon Web Services