JVM大页内存的学习与使用

发布时间 2024-01-02 09:10:59作者: 济南小老虎

JVM大页内存的学习与使用


原理和背景

操作系统是计算机的重要组成部分.
现代的操作系统一般都采用 段页式内存管理. 

段一般是为了管理和权限
页主要是为了虚拟内存和物理内存的映射. 

分页管理可以让物理上不连续的内存在程序看来是逻辑地址连续的. 
但是这也意味着分页分页内存管理需要有一个虚拟内存和物理内存的映射关系

为了加快操作系统的速度, 一般采用硬件的MMU进行映射管理.
而CPU内部有一块TLB 就是进行快速查找使用的 

CPU内存的寄存器容量是非常小的, 所以为了提高寸土寸金的利用率. 
大小恒定的TLB如果能够过滤查找更多的内存时, 他的效果是最佳的
2M的内存页比4KB的内存也, TLB 能够多存储512倍的地址空间
所以使用比默认地址页更大的内存页面, 是很好的提高访存性能的方法. 

64位系统的寻址空间其实非常大, 一般操作系统都采用 48位的虚拟地址空间
理论上可以访问 256T的内存. 

页面大小一般是从 2的12次方开始计算 也就是 4KB
然后每次提升 2的9次方. 也就是 2MB和 1GB.

JVM

JVM 其实是一套小型的虚拟机. 
其实自己也是一套操作系统.
也进行进程管理, 内存管理, IO管理等. 
他的性能其实也受到硬件等的制约. 

比较大的内存情况下, 使用大页内存能够加快TLB的访存处理
对性能有比较好的提高. 

其实需要说明TLB: 每个核心都有自己的TLB. 
Linux环境下的不管是多进程结构(Nginx) 还是 多线程结构(JVM) 其实都是prcess的概念.
他的TLB其实是多核心理论上需要保持同步. 

进程切换时, 其实TLB就会被刷出和刷入, 是进程切换的一大时间损耗.

如果能够减少TLB的内容, 并且符合程序的空间和时间局限性, 那么性能可能会有较大的提升. 
不需要加载太多的TLB, 并且可以访存更大的地址, 提高性能. 

大页内存的种类

透明大页和大页

透明大页是 redhat 发明的
他的目标是减少管理成本, 只要开启了, 他会自主的帮你去扩展连续的页面作为大页使用.
他不会造成不使用透明大页的内存浪费, 但是他的申请和释放会有比较大的延迟, 
所以很多大型内存应用,比如Oracle数据库 严令需要关闭透明大页 

大页内存
大页内存在有足够空间时指定, 并且设置了之后不使用大页内存的程序无法访问这一块内存.
基本上可以理解为是独占独享的, 不会被释放,也不会被swap到磁盘
性能是最优秀的, 但是也是比较浪费空间的一种方式. 

开启也大页内存 需要说明必须修改默认共享段的大小, 理论上可以设置的很大
大于操作系统的内存也可以. 

透明大页的使用方式

查看透明大页的情况:
cat /sys/kernel/mm/transparent_hugepage/enabled
如果JVM使用透明大页需要修改为:
echo "madvise" > /sys/kernel/mm/transparent_hugepage/enabled

JVM 支持在 madvise mode 中配置时使用 THP ,但需要使用 -XX:+UseTransparentHugePages。
完成此操作后,Java 堆以及其他内部 JVM 数据结构将由 transparent huge pages 支持。

可以在 JVM的启动日志里面: -Xlog:gc+init -Xlog:pagesize 进行查看. 

标准大页的使用方式

查看系统里面的大页信息
ls /sys/kernel/mm/hugepages/
一般会得到两个:
hugepages-2048kB  hugepages-524288kB

一般可以采用在线修改. 或者是修改 sysctl.conf的方式进行
如果没发重启机器 或者是其他方式, 可以使用 如下方式进行处理. 
echo 64009 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

需要注意 JVM的参数与 透明大页的不一样:
-XX:+UseLargePages  或者是 -XX:+UseHugeTLBFS 进行启用.

优缺点

两种方法各有利弊,选择哪一种取决于多个方面。

THP 更易于设置和使用,但在使用 HugeTLB 页面时你有更多控制权。
如果延迟是你最关心的问题,那么你可能应该使用 HugeTLB 页面,因为你永远不会等待操作系统释放足够的连续内存。
作为替代方案,你可以将 defrag THP 选项配置为在没有 large pages 可用时不停止,但这可能会带来吞吐量成本。
如果内存占用是一个问题,THP 是避免必须预先提交整个 Java 堆的更好选择。

使用哪种类型的 large pages 取决于应用程序和环境,但在很多情况下,使用任何类型的 large pages 都会对性能产生积极影响。

来源: https://juejin.cn/post/7011002046899978253