就Linux应用程序而言,使用的都是虚拟地址,当应用程序读写一个指定的虚拟地址时,内存管理单元会自动进行虚拟地址到物理地址的转换。一个虚拟地址可以映射到多个物理地址,但当前映射到哪一个物理地址取决于当前的页表(Page Table,一个虚拟地址到物理地址的映射转换表)内容,页表存储在主存储器中,查询速度相对比较慢。为了提高地址转换性能,大多数体系架构都提供一个快速查找缓冲TLB(Translation Lookaside Buffer),TLB读写速度非常快,比如在X86体系架构上,TLB和普通的CPU CACHE并没有本质区别,只不过TLB专职用于缓存页表数据,而普通的CPU CACHE缓存实际的代码指令或数据。TLB缓冲了最近使用过的页表项,在进行虚拟地址到物理地址的转换时先查这个TLB缓冲,只有当查找TLB缓冲失败(TLB miss)后才再去查普通页表(好像有的架构是同时进行查找?)。当然,根据局部性原理,大多数情况下应该都是查找TLB缓冲命中(TLB hit)的,所以性能得以大大提升。这整个具体的页表查找与地址转换过程不是文本描述的重点,但我们需知道如下几点:
1,TLB缓冲能大大提升虚拟地址到物理地址的转换速度。
2,TLB缓冲大小有限,只能缓存一定量的页表项目(Entry)。
3,如果一个页越大,那么一个页表项目就能表示越多的地址空间,整个TLB缓冲命中的几率就越大。
在Linux平台上,页大小普遍为4K,但根据硬件架构的不同,Linux内核也支持更大的内存页,也就是本文要介绍的HugeTLB特性。
[root@localhost ~]# cat /proc/meminfo | grep Huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
[root@localhost ~]#
HugePages_Total:系统当前总共拥有的HugePages数目。
HugePages_Free:系统当前总共拥有的空闲HugePages数目。
HugePages_Rsvd:系统当前总共保留的HugePages数目,更具体点就是指程序已经向系统申请,但是由于程序还没有实质的HugePages读写操作,因此系统尚未实际分配给程序的HugePages数目。
HugePages_Surp:指超过系统设定的常驻HugePages数目的数目。
Hugepagesize:每一页HugePages的大小。
[root@localhost ~]# cat /proc/sys/vm/nr_hugepages
0
[root@localhost ~]# cat /proc/sys/vm/nr_hugepages_mempolicy
0
[root@localhost ~]# cat /proc/sys/vm/nr_overcommit_hugepages
0
[root@localhost ~]#
[root@localhost ~]# echo 0 > /proc/sys/vm/nr_hugepages
[root@localhost ~]# echo 100 > /proc/sys/vm/nr_hugepages
[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total: 50
Node 0 HugePages_Free: 50
Node 0 HugePages_Surp: 0
Node 1 HugePages_Total: 50
Node 1 HugePages_Free: 50
Node 1 HugePages_Surp: 0
[root@localhost ~]#
[root@localhost ~]# echo 0 > /proc/sys/vm/nr_hugepages
[root@localhost ~]# numactl -m 0 echo 40 >/proc/sys/vm/nr_hugepages_mempolicy
[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total: 40
Node 0 HugePages_Free: 40
Node 0 HugePages_Surp: 0
Node 1 HugePages_Total: 0
Node 1 HugePages_Free: 0
Node 1 HugePages_Surp: 0
[root@localhost ~]# numactl -m 1 echo 60 >/proc/sys/vm/nr_hugepages_mempolicy
[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total: 40
Node 0 HugePages_Free: 40
Node 0 HugePages_Surp: 0
Node 1 HugePages_Total: 20
Node 1 HugePages_Free: 20
Node 1 HugePages_Surp: 0
[root@localhost ~]# echo 80 >/proc/sys/vm/nr_hugepages_mempolicy
[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total: 50
Node 0 HugePages_Free: 50
Node 0 HugePages_Surp: 0
Node 1 HugePages_Total: 30
Node 1 HugePages_Free: 30
Node 1 HugePages_Surp: 0
[root@localhost ~]# numactl -m 1 echo 100 >/proc/sys/vm/nr_hugepages
[root@localhost ~]# cat /sys/devices/system/node/node*/meminfo | fgrep Huge
Node 0 HugePages_Total: 60
Node 0 HugePages_Free: 60
Node 0 HugePages_Surp: 0
Node 1 HugePages_Total: 40
Node 1 HugePages_Free: 40
Node 1 HugePages_Surp: 0
另一个/proc接口:/proc/sys/vm/nr_overcommit_hugepages,表示程序申请HugePages可超过常驻HugePages数目的最大数目。
参考:
http://blog.csdn.net/cybertan/article/details/9035727