为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。
内存是计算机的重要资源,虽然今天大多数的服务对内存的需求都没有那么高,但是数据库以及 Hadoop 全家桶这些服务却是消耗内存的大户,它们在生产环境动辄占用 GB 和 TB 量级的内存来提升计算的速度,Linux 操作系统为了更好、更快地管理这些内存并降低开销引入了很多策略,我们今天要介绍的是 HugePages,也就是大页[^1]。
绝大多数的 CPU 架构都支持更大的页面,只是不同操作系统会使用不同的术语,例如:Linux 上的 HugePages、BSD 上的 SuperPages 以及 Windows 上的 LargePages,这些不同的术语都代表着类似的大页面功能。
图 1 – CPU 架构和更大的页面
我们都知道 Linux 会以页为单位管理内存,而默认的页面大小为 4KB,虽然部分处理器会使用 8KB、16KB 后者 64KB 作为默认的页面大小,不过 4KB 仍然是操作系统的默认页面配置的主流[^2],虽然 64KB 的页面是 4KB 的 16 倍,但是与最小 2MB 的 HugePages 相比,64KB 的页面实在是不够大,更不用说默认的 4KB 了:
图 2 – 默认和大页面大小
2MB 一般都是 HugePages 的默认大小,在 arm64 和 x86_64 的架构上甚至支持 1GB 的大页面,是 Linux 默认页面大小的 262,144 倍,我们可以使用如下所示的命令查看当前机器上 HugePages 的相关信息:
$cat/proc/meminfo|grepHuge AnonHugePages:71680kB ShmemHugePages:0kB FileHugePages:0kB HugePages_Total:0 HugePages_Free:0 HugePages_Rsvd:0 HugePages_Surp:0 Hugepagesize:2048kB Hugetlb:0kB