大页和透明大页
关于大页和透明大页的介绍可以看看redhat的doc:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-transhuge.html
翻译一下:
内存是一块一块进行管理的,这一块又被成为是“页”。一页一般是4096字节(4kb)。1mb内存等于256页。1gb内存等于256000页。CPU有一个内置的内存管理单元,它有一个pagetable,会记录这些页,每个页都是这个pagetable的entry。
如果内存较多,有两种方式管理:
在硬件层面,增多内存管理单元中pagetable的entry数量
增大页大小
第一种方法过于昂贵,因为现代处理器的内存管理单元只支持数百个或者数千个page table entry。除此之外硬件和内存单元算法在当前数量的page table entry下工作良好,如果增多entry,可能有所不同。这就造成一个性能问题:如果页数超过了硬件内存单元支持的数量,系统会回退到基于软件的内存管理方式,这会让系统运行的更慢。
而大页是什么呢?简单的说,大页是就是大小为2mb或者1gb的页。如果内存是gb这个量级,那么pagetable使用2mb的页。如果内存是tb这个量级,那么pagetable使用1gb页。
大页手动管理起来比较麻烦,为了高效使用,需要代码上做一些改动。基于这个原因,redhat实现了透明大页(transparent huge pages,THP)。THP是一个抽象层,它自动创建/管理/使用大页。THP隐藏了使用大页的复杂性,这不管是对于开发者还是管理员来说都是好事情。THP的目标是提升性能,他的开发者在很多系统上都测试过,并感知到了性能的提升。大多数系统都可以通过配置THP来提升性能,然而,在数据库环境下THP不推荐使用。
目前THP只支持映射匿名内存区域如heap和stack空间。
回到JVM,必须同时开启:
-XX:+UseLargePages
-XX:+UseTransparentHugePages
-XX:+UseHugeTLBFS
-XX:+UseSHM
JVM才会设置大页。这块代码在os::large_page_init()里,linux上是读取/proc/meminfo里面的Hugepagesize项,拿到系统大页大小。windows是调GetLargePageMinimum()这个win32api
$cat /proc/meminfo | grep Hugepagesize
Hugepagesize: 2048 kB