适用于:✔️ Linux VM
原始 KB 数: 4038684
注意
本文中引用的 CentOS 是 Linux 分发版,将达到生命周期结束(EOL)。 请相应地考虑使用和规划。 有关详细信息,请参阅 CentOS 生命周期指南。
总结
本文提供了解决方案,针对 Azure Linux 虚拟机在内核版本低于 3.10 的 Linux 系统中,其最大内存被限制为 64 GB 的问题。
现象
你在 Microsoft Azure 上创建了一台具有超过 64GB 内存的 Linux 虚拟机 (VM)。 你会发现 Linux VM 上实际分配的内存只有 64 GB。
注意
必须检查 Linux VM 中的可用内存,以确定内存是否限制为 64 GB。 例如,使用 免费的 -m 命令。 Azure门户始终显示分配给 VM 的完整内存大小。
原因
此问题是由 3.10 之前的版本中 Linux 内核中的 bug 引起的。 该 bug 已在 Linux 内核版本 3.10 及更高版本中修复。
Azure中的 VM 托管在 Windows Server 2016 Hyper-V 或 Windows Server 2012 R2 Hyper-V上。 VM 在 Windows Server 2012 R2 Hyper-V 主机上运行时,该 bug 不会显示,因为Hyper-V提供给来宾 VM 的最大物理地址空间大小为 4 TB。 但是,当来宾 VM 在Windows Server 2016 Hyper-V主机上运行时,最大物理地址空间大小将增加到 16 TB。 在此场景中,bug 表现会导致 Linux 客户机看到最多 64 GB 内存。 64 GB 值由Hyper-V提供给来宾的内存类型范围寄存器(MTRR)值控制。
将 VM 分配到 Windows Server 2012 R2 或 Windows Server 2016 主机由 Azure 基础结构控制,用户无法选择。 因此,某些部署可能会遇到此问题,而另一些部署则不会。
解决方法
此 bug 发生在 SUSE Linux Enterprise Server (SLES) 11 SP4、Red Hat Enterprise Linux (RHEL) 6.x 和 CentOS 6.x 的 Linux 内核版本中。 它在较新的 Linux 内核中已修复,并且不会在 SLES 12、RHEL 7.x 和 CentOS 7.x 中发生。
对于存在 bug 的内核,可以通过将 disable_mtrr_trim 添加到内核启动行选项来解决该问题。 Microsoft正在与经官方认可的分发版供应商合作,更新Azure映像,添加 disable_mtrr_trim 作为内核启动行选项。 此选项禁用 MTRR 解释并删除 64 GB 限制。 如果从已更新为包含此内核启动行选项的映像创建新的 VM,则无论部署 VM 的主机版本如何,都不会遇到 64 GB 的限制。
对于现有 VM,可以使用以下步骤手动添加相同的内核启动行选项。
-
对于 RHEL/CentOS 6.x:ing:
-
在文本编辑器中打开
/boot/grub/grub.conf文件。 -
将参数 disable_mtrr_trim 添加到内核命令行。
在 grub.conf 文件中,会有如下所示的行:
kernel /vmlinuz-2.6.32-696.3.2.el6.x86_64 ro root=UUID=<ID>将 disable_mtrr_trim 添加为此行末尾的单独参数。
-
保存并关闭 grub.conf 文件。
-
重启 VM。
有关详细信息,请参阅 Red Hat:GRUB 菜单配置文件。
-
-
对于 SLES,请参阅 SUSE:使用 GRUB 启动。
-
对于 Debian,请参阅 Debian:启动参数。
第三方信息免责声明
本文讨论的第三方产品由独立于Microsoft的公司制造。 Microsoft对这些产品的性能或可靠性不作任何默示或其他保证。
第三方联系人免责声明
Microsoft提供第三方联系信息,可帮助你查找有关本主题的其他信息。 此联系信息可能会更改,恕不另行通知。 Microsoft不能保证第三方联系信息的准确性。