我们在集群中有多台服务器,我们想知道一般在什么情况下需要配置大页面?
我也有几个问题
- “内存页面大小”是否等于大页面?
在我的 Linux 服务器中,我输入以下命令来验证默认内存页面大小
grep Hugepagesize /proc/meminfo
Hugepagesize: 2048 kB
getconf PAGESIZE
4096
但正如大家看到的,我们得到了不同的结果,为什么?
使用大页面有哪些风险?
禁用透明大页面 - 意味着禁用 HUGE PAGES 选项?
答案1
当应用程序需要进行随机访问的大型映射时,大页面非常有用,因为这是转换后备缓冲区 (TLB) 最糟糕的情况。您需要牺牲映射粒度来换取 TLB 条目。
页面(包括大页面)只能映射到相同大小的物理内存块,并与该大小对齐。因此,2 MB 的大页面需要映射到物理 RAM 中的 2MB 边界,而 1GB 的大页面需要映射到 1GB 边界,因为低位地址是页面内的数据,这里不能添加偏移量。
这意味着大页面通常在系统启动时保留,此时物理内存尚未碎片化。支持大页面的应用程序可用于hugetlbfs
分配它们。
您必须使用内核参数来决定大页面的大小应该是 2MB 还是 1GB,您不能混合使用它们。正常的 4kB 页面始终可用。
最常见的用例是虚拟机(qemu/kvm 可以使用大页面),这允许将 VM 的整个内存映射保存在少量的 TLB 条目中,因此这些条目永远不会被逐出,因此 VM 内部的内存访问只需要在客户机上下文内进行页表查找。
一些数据库系统也支持大页面,但这通常仅在处理大型数据集和索引时才有用。
问题:
有普通 (4kB) 页面和超大 (2MB 或 1GB) 页面。查询页面大小时,您将获得普通页面的大小;查询超大页面大小时,您将获得超大页面的设置。普通页面和超大页面都可以并行使用,但不能混合使用不同的超大页面大小。
您会得到不同的结果,因为这是两个不同的东西。普通页面的大小在硬件中是固定的,因此它不是一个设置。
大页面需要尽早分配,虽然内存在技术上是“空闲”的,但它只能用于支持大页面的应用程序,因此除了支持大页面的应用程序之外,其他应用程序的可用内存都会减少。这通常不是问题,因为您可以在专用于内存密集型应用程序(如虚拟机或数据库)的机器上使用大页面。
透明大页面尝试将内存用作缓冲区和缓存(与第 3 条相反),并尝试将大页面提供给映射大内存块的应用程序,因此不支持大页面的应用程序仍然可以从中受益 - 基本上,如果可能,请求 2MB/1GB 内存块的应用程序将被分配大页面。这是否有助于或损害性能取决于您的应用程序。如果您有一个支持大页面的应用程序并且想要手动分配内存,则需要禁用 THP,而具有不支持大页面的数据库应用程序的系统可能会受益。
答案2
大页面的明显用例是当 PageTables(在 /proc/meminfo 中可见)达到数十 GB 时。这意味着仅跟踪内存就需要大量内存和 CPU 开销。这种情况发生在大量内存、大量进程或两者兼而有之的情况下。通常在数据库应用程序中。
大页面显著减少了开销,因为单个页表条目现在可以处理更多内存,例如 2,048 KB 而不是 4 KB。(其他平台上的大小不同,例如 POWER 上的 AIX 支持 16 MB 大页面。)
Linux 上的大页面可能无法用于文件缓存,而且对于非共享内存,malloc() 分配几 MB 内存既烦人又低效。因此,管理员必须分配只能用于某些目的的大页面池。这是使用大页面的缺点。
透明大页面 (THP) 尝试通过自动将连续内存“碎片整理”到大页面中来减少管理的烦人程度。其想法是使预分配大页面成为可选项。好处高度特定于工作负载,可能会花费太多 CPU 而不值得。禁用 THP 意味着您仍然可以手动分配大页面。有时值得关闭 THP 并将数据库的共享内存段放入大页面中。
关于 Linux 大页面的最后一个抱怨是:我发现管理它很烦人。
- 共享内存使用一个接口,但对于其他接口,您可以使用 hugetlbfs 库和文件系统。
- 您可能会通过分配过多的大页面而不配置应用程序来使用它而“浪费”内存。
- 该页面数必须根据每个主机大小进行缩放,因为它是页面数而不是内存百分比。
- 通常,分配大页面的能力仅限于一个组,切换数据库用户可能会导致意外的内存浪费。