為什麼 HugePages 可以提升資料庫性能

2021-01-17 真沒什麼邏輯

為什麼這麼設計(Why’s THE Design)是一系列關於計算機領域中程序設計決策的文章,我們在這個系列的每一篇文章中都會提出一個具體的問題並從不同的角度討論這種設計的優缺點、對具體實現造成的影響。如果你有想要了解的問題,可以在文章下面留言。

內存是計算機的重要資源,雖然今天大多數的服務對內存的需求都沒有那麼高,但是資料庫以及 Hadoop 全家桶這些服務卻是消耗內存的大戶,它們在生產環境動輒佔用 GB 和 TB 量級的內存來提升計算的速度,Linux 作業系統為了更好、更快地管理這些內存並降低開銷引入了很多策略,我們今天要介紹的是 HugePages,也就是大頁[^1]。

絕大多數的 CPU 架構都支持更大的頁面,只是不同作業系統會使用不同的術語,例如:Linux 上的 HugePages、BSD 上的 SuperPages 以及 Windows 上的 LargePages,這些不同的術語都代表著類似的大頁面功能。

圖 1 - CPU 架構和更大的頁面

我們都知道 Linux 會以頁為單位管理內存,而默認的頁面大小為 4KB,雖然部分處理器會使用 8KB、16KB 後者 64KB 作為默認的頁面大小,不過 4KB 仍然是作業系統的默認頁面配置的主流[^2],雖然 64KB 的頁面是 4KB 的 16 倍,但是與最小 2MB 的 HugePages 相比,64KB 的頁面實在是不夠大,更不用說默認的 4KB 了:

圖 2 - 默認和大頁面大小

2MB 一般都是 HugePages 的默認大小,在 arm64 和 x86_64 的架構上甚至支持 1GB 的大頁面,是 Linux 默認頁面大小的 262,144 倍,我們可以使用如下所示的命令查看當前機器上 HugePages 的相關信息:

$ cat /proc/meminfo | grep Huge
AnonHugePages: 71680 kB
ShmemHugePages: 0 kB
FileHugePages: 0 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
Hugetlb: 0 kB

通過上面的輸出結果,我們可以看到當前機器上的大頁面默認大小為 2MB 並且大頁面的數量也為 0,即沒有進程在申請或者使用大頁。各位讀者可以在 Linux 嘗試執行上述命令,如果機器上沒有做過額外的配置,那麼使用上述命令得到的輸出與這裡也不會有太大的差別。

/proc/sys/vm/nr_hugepages 中存儲的數據就是大頁面的數量,雖然在默認情況下它的值都是 0,不過我們可以通過更改該文件的內容申請或者釋放作業系統中的大頁:

$ echo 1 > /proc/sys/vm/nr_hugepages
$ cat /proc/meminfo | grep HugePages_
HugePages_Total: 1
HugePages_Free: 1
...

在 Linux 中,與其他內存的申請和釋放方式相同,我們可以在向 mmap 系統調用中傳入 MAP_HUGETLB 標記申請作業系統的大頁並使用 munmap 釋放內存[^3],使用如下所示的代碼片段可以在作業系統中申請 2MB 的大頁:

size_t s = (2UL * 1024 * 1024);

char *m = mmap(
    NULL, s, PROT_READ | PROT_WRITE,
    MAP_PRIVATE | MAP_ANONYMOUS | MAP_HUGETLB /* flags */,
    -1, 0
);

munmap(m, s);

雖然 HugePages 的申請方式與默認的內存相差不多,但是它實際上是作業系統單獨管理的特殊資源,Linux 會在 /proc/meminfo 中單獨展示 HugePages 的相關數據,而容器編排系統 Kubernetes 也會認為大頁是不同於內存的獨立資源,如下所示的 Pod 也需要單獨申請大頁資源[^4]:

apiVersion: v1
kind: Pod
metadata:
  name: huge-pages-example
spec:
  containers:
  - name: example
    ...
    volumeMounts:
    - mountPath: /hugepages-2Mi
      name: hugepage-2mi
    - mountPath: /hugepages-1Gi
      name: hugepage-1gi
    resources:
      limits:
        hugepages-2Mi: 100Mi
        hugepages-1Gi: 2Gi
        memory: 100Mi
      requests:
        memory: 100Mi
  volumes:
  - name: hugepage-2mi
    emptyDir:
      medium: HugePages-2Mi
  - name: hugepage-1gi
    emptyDir:
      medium: HugePages-1Gi

作為 Linux 從 2.6.32 引入的新特性,HugePages 能夠提升資料庫、Hadoop 全家桶等佔用大量內存的服務的性能,該特性對於常見的 Web 服務以及後端服務沒有太多的幫助,反而可能會影響服務的性能,我們在這篇文章中會介紹 HugePages 為什麼能夠提升資料庫等服務的性能:

HugePages 可以鎖定內存,禁止作業系統的內存交換和釋放;管理開銷

雖然 HugePages 的開啟大都需要開發或者運維工程師的額外配置,但是在應用程式中啟用 HugePages 卻可以在以下幾個方面降低內存頁面的管理開銷:

更大的內存頁能夠減少內存中的頁表層級,這不僅可以降低頁表的內存佔用,也能降低從虛擬內存到物理內存轉換的性能損耗;更大的內存頁意味著更高的緩存命中率,CPU 有更高的機率可以直接在 TLB(Translation lookaside buffer)中獲取對應的物理地址;更大的內存頁可以減少獲取大內存的次數,使用 HugePages 每次可以獲取 2MB 的內存,是 4KB 的默認頁效率的 512 倍;

因為進程的地址空間都是虛擬的,所以 CPU 和作業系統需要記錄頁面和進程之間的對應關係,作業系統中的頁面越多,我們也就需要花費更多的時間在如下所示的五層頁表結構中查找虛擬內存對應的物理內存,我們會根據虛擬地址依次訪問頁表中的目錄(Directory)最終查找到對應的物理內存:

圖 3 - 默認頁的五層頁表

如上圖所示,如果我們使用 Linux 中默認的 4KB 內存頁,那麼 CPU 在訪問對應的內存時需要分別讀取 PGD、PUD、PMD 和 PTE 才能獲取物理內存,但是 2MB 的大內存可以減少目錄訪問的次數:

圖 4 - 頁表與大頁

因為 2MB 的內存頁佔用了 21 位的地址,所以我們也不再需要五層頁表中的 PTE 結構,這不僅能夠減少翻譯虛擬地址時訪問頁表的次數,還能夠降低頁表的內存佔用。

CPU 總可以通過上述複雜的目錄結構找到虛擬頁對應的物理頁,但是每次翻譯虛擬地址時都使用上述結構是非常昂貴的操作,作業系統使用 TLB 作為緩存來解決這個問題,TLB 是內存管理組件(Memory Management Unit)的一個部分,其中緩存的頁表項可以幫助我們快速翻譯虛擬地址:

圖 5 - TLB

更大的內存頁面意味著更高的緩存命中率,因為 TLB 緩存的容量是一定的,它只能緩存指定數量的頁面,在這種情況下,緩存 2MB 的大頁能夠為系統提高緩存的命中率,從而提高系統的整體性能。

除了較少頁表項和提高緩存命中率之外,使用更大的頁面還可以提高內存的訪問效率,對於相同的 1GB 內存,使用 4KB 的內存頁需要系統處理 262,144 次,但是使用 2MB 的大頁卻只需要 512 次,這可以將系統獲取內存所需要的處理次數降低幾個數量級。

鎖定內存

使用 HugePages 可以鎖定內存,禁止作業系統的內存交換和釋放。Linux 系統提供了交換分區(Swap)機制,該機制會在內存不足時將一部分內存頁從內存拷貝到磁碟上,釋放內存頁佔用的內存空間,而當對應的內存進程訪問時又會被交換到內存中,這種機制能夠為進程構造一種內存充足的假象,但是也會造成各種問題。

圖 6 - 交換分區

我們在 為什麼 NUMA 會影響程序的延遲 一文中就介紹過 Swap 在開啟 NUMA 時可能會影響資料庫的性能[^5],系統中偶然發生的 Swap 並不是不可以接受的,但是頻繁地讀寫磁碟會顯著地降低作業系統的運行速度。

HugePages 與其他內存頁不同,它是由系統工程師預先在作業系統上使用命令分配的,當進程通過 mmap 或者其他系統調用申請大頁時,它們得到的都是預先分配的資源。Linux 中的 HugePages 都被鎖定在內存中,所以哪怕是在系統內存不足時,它們也不會被 Swap 到磁碟上,這也就能從根源上杜絕了重要內存被頻繁換入和換出的可能[^6]。

REHL 6 引入了透明大頁(Transparent Huge Pages、THP),它是一個可以自動創建、管理和使用大頁的抽象層,能夠為系統管理員和開發者隱藏了大頁使用時的複雜性,但是不推薦在資料庫以及類似負載中開啟。[^7]

總結

隨著單機內存越來越大、服務消耗的內存越來越多,Linux 和其他作業系統都引入了類似 HugePages 的功能,該功能可以從以下兩個方面提升資料庫等佔用大量內存的服務的性能:

HugePages 可以降低內存頁面的管理開銷,它可以減少進程中的頁表項、提高 TLB 緩存的命中率和內存的訪問效率;HugePages 可以鎖定內存,禁止作業系統的內存交換和釋放,不會被交換到磁碟上為其它請求讓出內存;

雖然 HugePages 的管理相對比較複雜,需要系統管理員額外做出特定的配置,但是對於特定類型的工作負載,它確定能夠起到降低管理開銷和鎖定內存的作用,從而提高系統的性能。到最後,我們還是來看一些比較開放的相關問題,有興趣的讀者可以仔細思考一下下面的問題:

透明大頁(Transparent Huge Pages、THP)可能會造成哪些問題?手動管理系統中的 HugePages 有哪些優點?

如果對文章中的內容有疑問或者想要了解更多軟體工程上一些設計決策背後的原因,可以在博客下面留言,作者會及時回複本文相關的疑問並選擇其中合適的主題作為後續的內容。

推薦閱讀圖是怎麼畫的

相關焦點

  • 雲主機的13G內存去哪裡了 聊聊Hugepages大頁內存管理
    二、揭秘雲主機的13G內存從上面的進程信息中我們可以看出,這臺雲主機主要運行的是oracle資料庫,稍後有oracle經驗的人都有所了解,在oracle部署和使用時往往需要配置HugePages,HugePages對於Linux上提升Oracle資料庫性能是至關重要的。
  • 鳥哥:讓你的 PHP 7 更快之 Hugepage
    作者: Laruence (鳥哥)( )  開源中國ID: @Laruence 本文地址: http://www.laruence.com/2015/10/02/3069.html   轉載請註明出處PHP 7 剛剛發布了 RC4,包含一些bug修復和一個我們最新的性能提升成果
  • 百度安全開源大規模圖資料庫HugeGraph
    HugeGraph擁有良好的讀寫性能,並且我們根據安全業務場景對圖資料庫的核心功能(例如批量寫入、最短路徑、N度關係等)做了重點優化,與常見圖資料庫Neo4j和TitanDB等相比較,HugeGraph擁有明顯的性能優勢。
  • TBase資料庫開源後首次升級,複雜查詢性能提升十倍
    【環球網科技綜合報導】7月13日,騰訊雲自研分布式HTAP資料庫TBase正式發布最新開源版本,該版本在多活分布式能力、性能、安全性、可維護性等多個關鍵領域得到全面的增強和升級,複雜查詢的性能提升十倍以上。
  • 騰訊雲開源資料庫TBase迎來首次升級,複雜查詢的性能提升十倍以上
    2019年11月,騰訊宣布正式對外開源分布式資料庫TBase,受到資料庫界的廣泛關注,如今這款分布式資料庫迎來了開源後的首次升級。7月13日消息,騰訊雲自研分布式HTAP資料庫TBase正式發布最新開源版本。
  • 如何使用智能SQL查詢提升應用程式性能?
    為什麼資料庫導致如此多的性能問題?我們常常忘了每個請求與其他請求並非獨立。如果一個請求很慢,它不太可能影響其他請求,是這樣嗎?資料庫是由應用程式中運行的所有進程使用的共享資源。即便只有一處設計不當的訪問也可能拖累整個系統的性能。
  • 眾泰汽車:提升汽車產品競爭力 眾泰創建「汽車材料資料庫」
    以此為契機,眾泰汽車建立了 「汽車材料資料庫」,資料庫全面覆蓋了非金屬材料、金屬材料、油品、油漆、膠粘劑等。「汽車材料資料庫」為產品的開發設計提供了優質資源和質量保障。資料庫的建立,還使汽車產品設計開發過程中的工程樣件認可(OTS認可)速度加快,從產品開發的速度和質量等方面, 眾泰汽車的產品競爭能力得到切實提升。
  • 我們為什麼需要圖資料庫?
    圖資料庫在處理關聯數據時的優勢與關係型資料庫相比,圖資料庫在處理關聯數據時有三個非常突出的技術優勢:高性能:隨著數據量的增多和關聯深度的增加,傳統關係型資料庫受制於檢索時需要多個表之間連接操作,數據寫入時也需考慮外鍵約束,從而導致較大的額外開銷,產生嚴重的性能問題。而圖模型固有的數據索引結構,使得它的數據查詢與分析速度更快。
  • GTX1180曝光 Volta架構12nm工藝性能提升50%
    在大家都對20系顯卡有所憧憬的時候,TechPowerUp資料庫中出現了GTX 1180的身影。  從資料庫中能夠看到,GTX 1180採用了Volta架構,核心為GV104,基於12nm製程工藝,有3584個流處理器,224個陰影單元,64個光柵單元,256bit顯存位寬,16GB GDDR6內存,12GHz內存頻率。
  • Oracle資料庫21c進一步鞏固甲骨文在資料庫的業界領導地位
    甲骨文資料庫伺服器技術執行副總裁Andrew Mendelsohn表示,「Oracle資料庫21c延續了甲骨文提供全球領先融合資料庫引擎的戰略,提供領先的JSON文檔處理性能、由Intel® Optane™持久性內存所支持的顛覆性資料庫運營性能,以及行業領先的分析資料庫技術,如全新的自治管理內存列存儲、超高性能圖形處理、簡易機器學習模型開發的AutoML,以及不可變區塊鏈以防SQL表篡改等
  • 您知道huge是什麼意思嗎?
    說到huge這個單詞,很多人會想到的意思是巨大的、大的。除了這個意思,huge還有什麼意思呢?今天,我們就一起看一下huge的用法。首先,單詞huge是一個形容詞,它的比較級huger;最高級hugest。下面,我們看一些句子。
  • 為什麼需要圖資料庫?這篇文章為你介紹圖資料庫原理-數易軒
    它們也主要被視為學術資料庫,因為此類資料庫的最早使用案例之一是構建邏輯分析系統,並且由於其學術聯繫,該資料庫在相當長的時間內沒有應用於商業中。然而,到2014年年中,幾個關鍵性的進展都聚集在一起,使圖資料庫技術得到了第一次的提升。Neo4J是一個早期且仍被廣泛使用的圖資料庫,已經開始獲得足夠的成熟度和滲透性,開始被用於某些類別的數學圖形處理。
  • 性能飆升160%!阿里雲發布第七代ECS、雲原生資料庫PolarDB-X等重磅...
    6月9日,阿里雲宣布推出第七代ECS、POLARDB-X資料庫、視覺智能開放平臺等重磅新品,在性能、穩定性和開發效率上繼續領跑全球。此外,阿里雲還發布了新一代數據中臺、混合雲管理平臺、雲原生數據倉庫等產品及解決方案,目前這些產品均已在阿里雲官網上線。
  • 圖資料庫和關係型資料庫的比較
    為什麼要使用圖形資料庫,或者更具體地說是Neo4j作為我們資料庫選擇?人們在邏輯上通常很自然使用類似圖的結構來模擬或描述它們的特定問題域。權限控制就是一個例子。在許多企業應用程式中。您通常擁有用戶表,角色表和資源表。然後你會使用多對多關係表來將用戶映射到對應的角色和角色資源。
  • 資料庫行業深度報告:歷史機遇,國產資料庫市場迎來十倍空間
    一、資料庫行業的基本情況(略)1.資料庫的性能:六個方面,一套標準資料庫的性能指標聚焦於 6 個方面:吞吐量、負載均衡、讀寫速度、分區分片、並發性和可用性。不同類型的資料庫由於使用場景的差異,在性能和功能上有不同的偏重,在這六個指標方面同樣會有所差異。常見的具體指標有平均每秒響應速度、查詢速度、平均每秒吞吐量等。
  • 為什麼Rocket Lake-S在Geekbench 5中提升極大?新架構的性能如何...
    2020年末的臺式機DIY市場無比精彩,AMD Zen 3微架構如期上市,發布了代號為Vermeer的銳龍5000系列處理器,帶來了高達19%的平均IPC同頻性能提升,讓桌面處理器的生產力和遊戲性能達到了新高度!
  • 字節內部「MySQL性能優化寶典」意外流出!極致經典,堪稱資料庫的...
    據統計,MySQL憑藉超強的性能和易用性,預計全球有超80%以上的開發者都在使用這款開源資料庫!  不可否認,它早已成為一個程式設計師的必備技能。無論是社招還是校招,都躲不過這道坎兒!那麼,作為一個程式設計師/準程式設計師的你,那該如何系統的學習呢?  那該怎麼系統的學習MySQL呢?
  • 亞馬遜第二代資料庫晶片採用7nm工藝 性能是第一代7倍
    【TechWeb】12月4日消息,據國外媒體報導,亞馬遜雲計算部門設計出第二代數據中心晶片的消息在上周就已出現,亞馬遜雲計算部門目前已披露了這一晶片的性能等信息。亞馬遜雲計算部門,是當地時間周二在官網披露第二代資料庫晶片Graviton2的性能、工藝等方面的信息的。
  • 雲和恩墨打造業內領先資料庫一體機zData
    、存儲節點和資料庫節點,實現隨時擴容,以及擴容後系統性能和處理能力的近線性增長。、可擴展性的雲資料庫服務,為用戶企業解決當前性能瓶頸和未來的資源敏捷擴展問題,大幅改善用戶企業管理和性能體驗。另外,zData 可以輕鬆實現計算資源和存儲資源隨業務變化的多維動態發展、性能線性增長以及動態添加磁碟和存儲節點需求。資源池化實現快速部署和動態擴展傳統的IT系統擴展和變更從硬體的選購配置到資料庫的安裝,會帶來高昂的時間和人力成本。
  • 內存+關係型資料庫將成為重要趨勢
    仿佛一夜之間,內存技術就從高性能計算以及華爾街交易系統等小眾應用領域,轉變成為了目前主流的資料庫技術。 內存技術拋棄了傳統的磁碟驅動器,使用半導體存儲體讓資料庫性能得到極大的提升。SAP公司就是內存技術的忠實擁躉,他們全力推廣的HANA內存資料庫管理系統,號稱可以支持非常廣泛的應用場景。 內存技術已經無處不在,在分析設備,Hadoop集群以及NoSQL,NewSQL領域我們都能夠看到內存技術的身影,它已經成為一股不可忽視的力量。