Linux傳統Huge Pages與Transparent Huge Pages再次學習總結

来源:http://www.cnblogs.com/kerrycode/archive/2017/10/31/7760026.html
-Advertisement-
Play Games

Linux下的大頁分為兩種類型:標準大頁(Huge Pages)和透明大頁(Transparent Huge Pages)。Huge Pages有時候也翻譯成大頁/標準大頁/傳統大頁,它們都是Huge Pages的不同中文翻譯名而已,順帶提一下這個,免得有人被這些名詞給混淆、誤導了。Huge Pag... ...


 

Linux下的大頁分為兩種類型:標準大頁(Huge Pages)和透明大頁(Transparent Huge Pages)。Huge Pages有時候也翻譯成大頁/標準大頁/傳統大頁,它們都是Huge Pages的不同中文翻譯名而已,順帶提一下這個,免得有人被這些名詞給混淆、誤導了。Huge Pages是從Linux Kernel 2.6後被引入的。目的是使用更大的記憶體頁面(memory page size) 以適應越來越大的系統記憶體,讓操作系統可以支持現代硬體架構的大頁面容量功能。透明大頁(Transparent Huge Pages)縮寫為THP,這個是RHEL 6(其它分支版本SUSE Linux Enterprise Server 11, and Oracle Linux 6 with earlier releases of Oracle Linux Unbreakable Enterprise Kernel 2 (UEK2))開始引入的一個功能。具體可以參考官方文檔。這兩者有啥區別呢?這兩者的區別在於大頁的分配機制,標準大頁管理是預分配的方式,而透明大頁管理則是動態分配的方式。相信有不少人將Huge PageTransparent Huge Pages混為一談。目前透明大頁與傳統HugePages聯用會出現一些問題,導致性能問題和系統重啟。Oracle 建議禁用透明大頁(Transparent Huge Pages)。在 Oracle Linux 6.5 版中,已刪除透明 HugePages

 

標準大頁(HuagePage)英文介紹

 

HugePages is a feature integrated into the Linux kernel with release 2.6. It is a method to have larger pages where it is useful for working with very large memory. It can be useful for both 32-bit and 64-bit configurations. HugePage sizes vary from 2MB to 256MB, depending on the kernel version and the hardware architecture. For Oracle Databases, using HugePages reduces the operating system maintenance of page states, and increases TLB (Translation Lookaside Buffer) hit ratio.

 

 

RHEL的官方文檔對傳統大頁(Huge Pages)和透明大頁(Transparent Huge Pages)這兩者的描述如下(https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Performance_Tuning_Guide/s-memory-transhuge.html)

 

Huge pages can be difficult to manage manually, and often require significant changes to code in order to be used effectively. As such, Red Hat Enterprise Linux 6 also implemented the use of transparent huge pages(THP). THP is an abstraction layer that automates most aspects of creating, managing, and using huge pages.

 

THP hides much of the complexity in using huge pages from system administrators and developers. As the goal of THP is improving performance, its developers (both from the community and Red Hat) have tested and optimized THP across a wide range of systems, configurations, applications, and workloads. This allows the default settings of THP to improve the performance of most system configurations. However, THP is not recommended for database workloads.

 

傳統大頁很難手動管理, 而且通常需要對代碼進行重大更改才能有效地使用。因此, 紅帽企業 Linux 6 實現引入了透明大頁面 (THP)THP 是一個抽象層, 可以自動創建、管理和使用傳統大頁的大多數方面。

THP為系統管理員和開發人員減少了很多使用傳統大頁的複雜性, 因為THP的目標是改進性能, 因此其它開發人員 (來自社區和紅帽) 已在各種系統、配置、應用程式和負載中對 THP 進行了測試和優化。這樣可讓 THP 的預設設置改進大多數系統配置性能。但是, 不建議對資料庫工作負載使用 THP

 

註:THP 目前只能映射非同步記憶體區域,比如堆和棧空間

 

我們知道,x86架構使用的是虛擬記憶體架構,其允許定址範圍超過硬體中的可用物理記憶體。這通過允許每個進程擁有自己可定址的記憶體來實現。該進程認為此記憶體是專供自己使用的。這稱為進程的虛擬記憶體。實際上,此記憶體可以是實際駐留於RAM 晶元上的物理記憶體,也可以是存儲在物理磁碟上被稱作交換區或分頁區的專用區域中。進程不知道虛擬記憶體是存儲在RAM 中還是磁碟上;記憶體由操作系統管理。如果所需記憶體超過可用物理記憶體,操作系統會將一些記憶體移出到分頁區。這種活動效率極低,是導致性能問題的常見原因。由於磁碟的存取速度遠低於RAM分頁的進程會遇到顯著的性能問題。

 

另外,隨著硬體的飛速發展,伺服器的記憶體越來越大,系統中使用的記憶體越多,管理該記憶體所需的資源也就越多。對於Linux 操作系統,通過 Linux kswapd 進程和頁表(Page Table)記憶體結構(針對系統中存在的每個進程包含一條記錄)實現記憶體管理。每條記錄包含進程使用的每頁虛擬記憶體及其物理地址(RAM 或磁碟)。通過使用處理器的TLB Translation Lookaside Buffer CPU中一小塊緩存)為該進程提供幫助。操作系統使用頁表條目管理系統中進程所用的記憶體。在 Linux 中,執行此管理的操作系統進程被稱作kswapd,可在操作系統工具中找到。TLB 緩存將緩存頁表條目來提高性能。典型的 TLB 緩存可保存 4 4096 個條目。對於數百萬甚至數十億個頁表條目,這種緩存就不夠用了。

 

當大量記憶體被用於ORACLE資料庫或其他應用時,操作系統將消耗大量資源來管理虛擬地址到物理地址轉換,其結果往往是一個非常大的頁表結構(Page Table)。由於每條頁表條目包含進程正在使用的所有記憶體頁面的虛擬地址到物理地址的轉換,因此對於非常大的系統全局區 (SGA),每個進程的頁表條目都可能很大。舉個例子,我們的一個測試伺服器,記憶體為64GBSGA_TARGET32G,如果沒有使用傳統大頁,頁表結構(PageTables)大小為1573080 kB,接近1.5G大小了。您可以看到,要管理的頁面數量巨大。這將導致顯著的性能開銷。

 

# grep PageTables /proc/meminfo

PageTables:      1573080 kB

 

這些就是傳統大頁為什麼會被引入的原因。 引入它能解決什麼問題呢?記憶體是由塊管理,即眾所周知的頁面。我們知道,在Linux 64位系統裡面,預設記憶體是以4K的頁面(Page)來管理的。也就是說一個頁面有 4096 位元組。1MB 記憶體等於 256 個頁面。2MB記憶體等於512個頁面。管理這些記憶體的消耗就比較大。CPU 有內嵌的記憶體管理單元TLB,這些單元中包含這些頁面列表,每個頁面都使用頁表條目。頁表(Page Table)用來存放虛擬記憶體和物理記憶體頁對應關係的記憶體結構。如果page size較小,那麼相應的頁表記憶體結構就會比較大。而Hugepages的預設值page size2M,是4KB500倍,所以可以大大減小Page Table的大小。通過啟用 HugePages使用大頁面,可以用一個頁表條目代表一個大頁面,而不是使用許多條目代表較小的頁面,從而可以管理更多記憶體,減少操作系統對頁面狀態的維護並提高 TLB 緩存命中率。註意,Hugepagesize的大小預設為2M,這個也是可以調整的。區間範圍為2MB to 256MB

 

如果上面這段解釋還不夠清晰、徹底,那麼看看下麵這段摘抄的解釋:

 

大多數操作系統採用了分段或分頁的方式進行管理。分段是粗粒度的管理方式,而分頁則是細粒度管理方式,分頁方式可以避免記憶體空間的浪費。相應地,也就存在記憶體的物理地址與虛擬地址的概念。通過前面這兩種方式,CPU必須把虛擬地址轉換程物理記憶體地址才能真正訪問記憶體。為了提高這個轉換效率,CPU會緩存最近的虛擬記憶體地址和物理記憶體地址的映射關係,並保存在一個由CPU維護的映射表中。為了儘量提高記憶體的訪問速度,需要在映射表中保存儘量多的映射關係。Linux的記憶體管理採取的是分頁存取機制,為了保證物理記憶體能得到充分的利用,內核會按照LRU演算法在適當的時候將物理記憶體中不經常使用的記憶體頁自動交換到虛擬記憶體中,而將經常使用的信息保留到物理記憶體。通常情況下,Linux預設情況下每頁是4K,這就意味著如果物理記憶體很大,則映射表的條目將會非常多,會影響CPU的檢索效率。因為記憶體大小是固定的,為了減少映射表的條目,可採取的辦法只有增加頁的尺寸。因此Hugepage便因此而來。也就是打破傳統的小頁面的記憶體管理方式,使用大頁面2M,4M等。如此一來映射條目則明顯減少。TLB 緩存命中率將大大提高。

 

 

ORACLE為什麼要使用標準大頁(Huge Pages)來提高性能?因為ORACLE資料庫使用共用記憶體(SGA)來管理可以共用的一些資源;比如shared pool中存儲了共用的SQL語句及執行計劃,buffer pool中存儲了數據塊。對這些資源的訪問,其實就是ORACLE使用OSAPI來訪問記憶體資源的過程。記憶體操作理應/通常意義上都是很快的,這時候Oracle資料庫可以很正常的工作。但是有些情況下也會出現性能問題:

 

a)如果SGA內的某一部分被swap到硬碟上,那麼再次訪問它,就需要花非常多的時間。

 

b)如果OS本身的記憶體非常的大,那麼管理/訪問到我們需要的記憶體的過程就需要更長時間。

 

在這些情況下,我們往往會碰到諸如latch/mutex/library cache lock[pin]/row cache lock的問題.

 

LinuxHugePage可以解決由以上兩種問題引發的性能波動。

 

我們知道,在Linux 64位系統裡面,預設記憶體是以4K的頁面(Page)來管理的,當系統有非常多的記憶體的時候,管理這些記憶體的消耗就比較大;HugePage使用2M大小的頁面來減小管理開銷。HugePage管理的記憶體並不能被Swap,這就避免了Swap引發的資料庫性能問題。所以,如果您的系統經常碰到因為swap引發的性能問題的系統毫無疑問需要啟用HugePage。另外,OS記憶體非常大的系統也需要啟用HugePage。但是具體多大就一定需要使用HugePage?這並沒有定論,有些文檔曾經提到12G以上就推薦開啟,我們強烈建議您在測試環境進行了充分的測試之後,再決定是否在生產環境應用HugePage

 

當然,任何事情都是有兩面性的,HugePage也有些小缺點。第一個缺點是它需要額外配置,但是這完全是可以忽略的。另外, 如果使用了HugePage11g新特性 AMMAutomatic Memory Management)就不能使用了,但是ASMMAutomatic Shared Memory Management)仍然可以繼續使用。

 

下麵是一些相關名詞以及Huge Pages的特征等等。大部分都是RHEL官網或Mos上相關英文資料以及對應的部分翻譯:

 

·         Page Table: A page table is the data structure of a virtual memory system in an operating system to store the mapping between virtual addresses and physical addresses. This means that on a virtual memory system, the memory is accessed by first accessing a page table and then accessing the actual memory location implicitly.

·         TLB: A Translation Lookaside Buffer (TLB) is a buffer (or cache) in a CPU that contains parts of the page table. This is a fixed size buffer being used to do virtual address translation faster.

·         hugetlb: This is an entry in the TLB that points to a HugePage (a large/big page larger than regular 4K and predefined in size). HugePages are implemented via hugetlb entries, i.e. we can say that a HugePage is handled by a "hugetlb page entry". The 'hugetlb" term is also (and mostly) used synonymously with a HugePage (See Note 261889.1). In this document the term "HugePage" is going to be used but keep in mind that mostly "hugetlb" refers to the same concept.

·         hugetlbfs: This is a new in-memory filesystem like tmpfs and is presented by 2.6 kernel. Pages allocated on hugetlbfs type filesystem are allocated in HugePages.

 

HugePages in 2.4 Kernels

 

The HugePages feature is backported to some 2.4 kernels. Kernel versions 2.4.21-* has this feature (See Note 311504.1 for the distributions with 2.4.21 kernels) but it is implemented in a different way. The feature is completely available. The difference from 2.6 implementation is the organization within the source code and the kernel parameters that are used for configuring HugePages. See Parameters/Setup section below.

 

 

Advantages of HugePages Over Normal Sharing Or AMM (see below)

 

·         Not swappable: HugePages are not swappable. Therefore there is no page-in/page-out mechanism overhead.HugePages are universally regarded as pinned.

 

 

    不可交換:HugePages不可交換。 因此沒有頁面換入/頁面換出的機制開銷.HugePages被普遍認為是固定在

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 事務的性質: 原子性:同一個事務中的所有操作要不然全部成功要不然全部失敗 一致性:一致性是指事務必須使資料庫從一個一致性狀態變換到另一個一致性狀態,,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。 隔離性:隔離性是當多個用戶併發訪問資料庫時,比如操作同一張表時,資料庫為每一個用戶開啟的事務 ...
  • #系統表 --查詢某類表中,某個欄位有哪些分佈 select * from user_tab_cols a where a.TABLE_NAME like '%TBL%' and a.COLUMN_NAME like '%CLEAR%' #分區 --分區表有哪些 SELECT * FROM useR ...
  • 1.什麼是資料庫? 資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,長期儲存在電腦內、有組織的、可共用的數據集合。 資料庫中的數據指的是以一定的數據模型組織、描述和儲存在一起、具有儘可能小的冗餘度、較高的數據獨立性和易擴展性的特點並可在一定範圍內為多個用戶共用。 2.主要特點 ...
  • --表變數 update invent set goodInfo=null declare @tmp_goods table( gno char(5) ) insert into @tmp_goods select gno from invent group by gno declare @gno ... ...
  • Success loading Mysql Driver!Mon Apr 04 15:43:00 CST 2016 WARN: Establishing SSL connection without server‘s identity verification is not recommended. ...
  • 環境: Linux js代碼: 迴圈刪除表中的數據: clear-mongodb-dialog.js 執行: --quiet 參數代表靜默執行,不會列印log等。 ...
  • 普通模式整合 一、在pom.xml中引入redis的依賴 二、新建redis.xml文件 三、在spring的配置文件中引入redis.xml 四、編寫dao層 五、編寫service層 六、寫測試類進行測試 哨兵模式(sentinel) 就一個配置文件獨特一點 redis-sentinel.xml ...
  • 一:概述 當我們設計一個系統時,需要考慮到系統的運行一段時間後,表裡數據量大約有多少,如果在初期,就能估算到某幾張表數據量非常龐大時(比如聊天消息表),就要把表創建好,這篇文章從創建表,增加數據,以及欄位擴展,這幾個方面來給出建議。 二:創建表 假如現在我們需要創建IM項目中的聊天消息表,這個表數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...