透明大页优化-通过配置透明大页,提高的性能
非常多的 x86 处理器都是通过一个叫页表(page table)的方案实现虚拟内存,这个方案会在内存中存一个非常大的映射表(实际上一个深度不同的树结构,不过也可以看作是一个稀疏表)。传统上,x86 处理器中一份页表条目对应一份4KB 的内存“页”
虽然页表都是存在内存里,但是处理器会缓存一部分页表条目到处理器的寄存器上,它被称为TLB 。查看我笔记本上的cpuid(1)(译注:Linux tool to dump x86 CPUID information about the CPU(s))发现最低等级的TLB 只包含64个条目,每个条目对应一份4KB 的数据页。现在是2017年,64*4KB 只有四分之一兆字节,远小于目前使用的大多数应用程序的工作内存。这种大小不匹配的情况意味着占用大量内存的应用程序会周期性的遇到TLB 不命中的情况,从而需要花费很高的代价访问主内存,只为得到具体的内存地址(译注:TLB Miss 之后需要访问内存中的页表,从而得到具体内存地址)。
为了改进TLB 的效率,x86 及其他处理器长期以来都支持创建“大页(huge pages)”,大页的页表条目能映射一大段的物理内存地址。根据操作系统的配置不同,大多数最近的芯片能够映射2MB,4MB,甚至1GB 的内存页。使用大页意味着TLB 存着更多的数据,对某些特定的任务来说效率更高。
什么是透明大页?
存在各种页表管理方式,这意味着操作系统需要决定如何映射地址空间和物理内存。由于应用程序的内存管理接口(例如mmap(2))一直都是基于最小的 4KB 页,所以内核映射数据必须以4KB 为单位。最简单和最灵活的(就已支持的内存布局而言)方案是只采用4KB 的页,应用程序映射内存无法使用大页。长期以来,这是内核最通用的内存管理策略。
对于需要大量内存并对性能敏感的应用程序(例如某些特定数据库或者科学计算程序),内核引入hugetlbfs 特性,该特性允许系统管理员通过配置让特定的应用程序使用大页。
透明大页(简称“THP”),正如其名,旨在自动为应用程序提供大页支持,不需要特殊配置(译注:透明大页的透明,类似透明代理的透明)。透明大页通过在后台扫描(使用khugepaged 内核线程)内存映射,尝试找到或者创建(通过移动相邻的内存)总共2MB 的连续4KB 映射,用一个大页来替换这一段内存映射。
每个进程都有自己的虚拟内存,需要对应到物理内存,这种映射关系被缓存在一个硬件中,这个硬件就是TLB(旁路转换缓冲),它是CPU缓存。
通过TLB,使用大页可以提高CPU的命中率, 所以如果guestos使用大内存或者内存负载比较重的情况下,通过配置透明大页(transparent large page, TLP)可以显著提高性能。
在RHEL里,大页的大小可以是2M,1G.默认情况下,已经开启了透明大页功能:
https://blog.51cto.com/lduan/1716188