[轉帖]JVM優化之調整大內存分頁(LargePage)

https://nowjava.com/article/31311

 

本文將從內存分頁的原理,如何調整分頁大小兩節內容,向你闡述LargePage對JVM的性能有何提升作用,並在文末點明瞭大內分頁的副作用。OK,讓我們開始吧!

內存分頁大小對性能的提升原理

首先,我們需要回顧一小部分計算機組成原理,這對理解大內存分頁至於JVM性能的提升是有好處的。

什麼是內存分頁?
我們知道,CPU是通過尋址來訪問內存的。32位CPU的尋址寬度是 0~0xFFFFFFFF ,計算後得到的大小是4G,也就是說可支持的物理內存最大是4G。

但在實踐過程中,碰到了這樣的問題,程序需要使用4G內存,而可用物理內存小於4G,導致程序不得不降低內存佔用。
爲了解決此類問題,現代CPU引入了?MMU(Memory Management Unit?內存管理單元)。

MMU 的核心思想是利用虛擬地址替代物理地址,即CPU尋址時使用虛址,由 MMU 負責將虛址映射爲物理地址。
MMU的引入,解決了對物理內存的限制,對程序來說,就像自己在使用4G內存一樣。

內存分頁(Paging)是在使用MMU的基礎上,提出的一種內存管理機制。它將虛擬地址和物理地址按固定大小(4K)分割成頁(page)和頁幀(page frame),並保證頁與頁幀的大小相同。

這種機制,從數據結構上,保證了訪問內存的高效,並使OS能支持非連續性的內存分配。
在程序內存不夠用時,還可以將不常用的物理內存頁轉移到其他存儲設備上,比如磁盤,這就是大家耳熟能詳的虛擬內存。

爲什麼要支持大內存分頁?
TLB是有限的,這點毫無疑問。當超出TLB的存儲極限時,就會發生 TLB miss,之後,OS就會命令CPU去訪問內存上的頁表。如果頻繁的出現TLB miss,程序的性能會下降地很快。

爲了讓TLB可以存儲更多的頁地址映射關係,我們的做法是調大內存分頁大小。

如果一個頁4M,對比一個頁4K,前者可以讓TLB多存儲1000個頁地址映射關係,性能的提升是比較可觀的。

調整OS和JVM內存分頁

在Linux和windows下要啓用大內存頁,有一些限制和設置步驟。

Linux:
限制:需要2.6內核以上或2.4內核已打大內存頁補丁。
確認是否支持,請在終端敲如下命令:

cat /proc/meminfo | grep Huge

HugePages_Total: 0
HugePages_Free: 0
Hugepagesize: 2048 kB

如果有HugePage字樣的輸出內容,說明你的OS是支持大內存分頁的。Hugepagesize就是默認的大內存頁size。
接下來,爲了讓JVM可以調整大內存頁size,需要設置下OS 共享內存段最大值 和 大內存頁數量。

共享內存段最大值
建議這個值大於Java Heap size,這個例子裏設置了4G內存。

echo 4294967295 > /proc/sys/kernel/shmmax

大內存頁數量

echo 154 > /proc/sys/vm/nr_hugepages

這個值一般是 Java進程佔用最大內存/單個頁的大小 ,比如java設置 1.5G,單個頁 10M,那麼數量爲 ?1536/10 = 154。
注意:因爲proc是內存FS,爲了不讓你的設置在重啓後被沖掉,建議寫個腳本放到 init 階段(rc.local)。

Windows:
限制:僅支持 windows server 2003 以上server版本
操作步驟:

  1. Control Panel -> Administrative Tools -> Local Security Policy
  2. Local Policies -> User Rights Assignment
  3. 雙擊 “Lock pages in memory”, 添加用戶和組
  4. 重啓電腦
    注意: 需要管理員操作。

單個頁大小調整
JVM啓用時加參數 -XX:LargePageSizeInBytes=10m
如果JDK是在1.5 update5以前的,還需要手動加 -XX:+UseLargePages,作用是啓用大內存頁支持。

大內存分頁的副作用

因爲每頁size變大了,導致JVM在計算Heap內部分區(perm, new, old)內存佔用比例時,會出現超出正常值的劃分。最壞情況下是,某個區會多佔用一個頁的大小。不過後續jvm版本也在調整這個策略。

一般情況,不建議將頁size調得太大,4-64M,是可以接受的(默認是4M)。爲了合理設置這個值,你應該對你的系統做一下benchmark。
說實話,網上我見過調得最猛的,有調到256M,從benchmark報表上看,性能不是太壞。如果你有64位的大內存機器,不妨嘗試一下。

另外,網上有很多GC調優的文章內容中都有提到 LargePageSizeInBytes,但未提任何OS限制。在OS不支持的情況下,設置這個參數,這個參數將僅僅是個擺設。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章