他们让我困惑。
大页:OS内核管理物理内存的方式,内核会将大页进行拆分,以减少其在页表中的索引号。
转换后备缓冲区:转换后备缓冲区 (TLB) 是内存管理硬件用来提高虚拟地址转换速度的 CPU 缓存。
大页面(操作系统级别)转换后备缓冲区(CPU 缓存)
https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt 文档说,/proc/sys/vm/nr_hugepages 表示内核大页面池中当前“持久”大页面的数量。
在我的服务器中,
echo 40 > /proc/sys/vm/nr_hugepages
cat /proc/meminfo | grep -i hugepage
AnonHugePages: 1675264 kB
HugePages_Total: 40
HugePages_Free: 40
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
接下来是我的问题。
AnonHugePages 是什么意思?为什么是 1675264KB?我认为有 40 x 2048KB 大页面内存。我不明白。
为什么我无法修改 Hugepagesize?理论上,内核可以修改大小。也许只是内核中没有接口。
如何获取 Translation Lookaside Buffer 的大小?我认为系统内核知道该大小,因为内核会使用它。
我希望我表达清楚了。
:)
答案1
AnonHugePages 被内核用作“透明大页面”。它们与 meminfo 中列出的“HugePages_Total”分开计算。
最初,要使用大页面,您的应用程序必须直接支持它们。Java 和 Oracle 都支持。我相信还有其他大内存用户使用它们。它们也必须手动配置。或者,您的应用程序必须使用 hugetlbfs,这是使用大页面的特定接口。hugetlbfs 使用“常规”大页面的系统池,例如直接使用大页面的应用程序。
最近,还增加了透明大页面。理论上,这可以让您享受大页面的好处,而无需修改应用程序。一个名为 khugepaged 的内核线程会扫描内存并将标准页面合并到大页面中。Red Hat 6 添加了透明大页面。我不知道其他发行版是否拥有它,但我知道这是一项正在进行的工作。
实际上,这有时会导致系统响应问题。我遇到过一个系统运行大量占用大量内存的 Java 应用程序(这些应用程序未手动配置为使用大页面)的问题。该系统有 128GB 的 RAM 并运行 RHEL6。运行 90 天左右后,内存会变得碎片化。此时,我们的系统会暂停一两分钟,大概是运行 khugepaged 时内存被锁定了。禁用透明大页面后,情况立即好转。我们仍然遇到一些性能问题,但将 Java 配置为使用手动大页面可以立即解决问题。
此演示文稿对大页面进行了深入的解释:
http://www.slideshare.net/raghusiddarth/transparent-hugepages-in-rhel-6
答案2
TLB 大小取决于 CPU 的品牌和型号。启用 PAE 后,大页面的大小固定为 4 MiB 或 2 MiB(由 CPU 确定)。我无法理解那里的 AnonHugePages 计数,因为如果真的有 40 个大页面,那将是 80 MiB,与该数字相差甚远。