关于大页面和 Translation Lookaside Buffer

关于大页面和 Translation Lookaside Buffer

他们让我困惑。

大页:OS内核管理物理内存的方式,内核会将大页进行拆分,以减少其在页表中的索引号。

我从以下网址获取: https://stackoverflow.com/questions/1973473/difference-between-cache-and-translation-lookaside-buffertlb

转换后备缓冲区:转换后备缓冲区 (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 

接下来是我的问题。

  1. AnonHugePages 是什么意思?为什么是 1675264KB?我认为有 40 x 2048KB 大页面内存。我不明白。

  2. 为什么我无法修改 Hugepagesize?理论上,内核可以修改大小。也许只是内核中没有接口。

  3. 如何获取 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,与该数字相差甚远。

相关内容