Linux的Hugepage

熟悉Linux内核内存管理机制的同学应该知道,在默认情况下,对于64bit的Linux kernel,内存页面是以4K为单位来管理的。这对于内存比较小的主机来说没有什么问题,但很明显的是对于较大——或者说现在16G内存应该已经成为服务器的标配了。这么小的粒度明显会带来很对性能的问题。

对于传统的Linux内存管理机制有几个问题往往会在大内存的情况下对系统的性能带来意想不到的反效果。

  • 上面提及的4K页面问题,如果OS的内存非常大,那么系统将会维护一个庞大的内存地址转换列表(PGD, PMD, PTE + offset),那每次访问需要花费更多的时间。
  • 再一个就是swap交换空间,如果一部分的内存空间被非预期的swap到了磁盘上,那每次对于地址空间的访问就会凭空多出了一个磁盘读写同步的过程。你当然可以简单粗暴的关闭swap了事,但这样的结果往往会是以内存撑爆之后的宕机为代价。

于是Linux有了hugepage的管理机制。

字面上很太容易理解了,话说这有点像磁盘的簇大小,这就是一个将4K页面提升到2M的技术。而这个技术就是针对上面的两个缺陷来的。

  1. Hugepage不会被交换,理论上开辟hugepage的应用都是大内存消耗型,而这类应用往往不希望被swap。
  2. 减少了页面表的大小,减轻了cpu的寻址压力。

如何开启hugepage?相信现在几乎所有的Linux都是2.6以上内核的了吧?

首先,设置系统为Hugepage保留的内存大小

susctl -w vm.nr_hugepages = 16

查看hugepage的启用状况

# grep Huge /proc/meminfo
HugePages_Total: 16
HugePages_Free: 12
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 1048576 kB

挂装一个hugetlbfs,

# mount -t hugetlbfs none /mnt -o pagesize=2MB
推荐阅读:
经常会通过一些通用的测试工具测
首先,提个问题:64bit x
接到一个黑盒的case:一套双

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据