多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php框架 > 框架設計 > Hugepages詳解

Hugepages詳解

來源:程序員人生   發布時間:2015-04-22 08:45:11 閱讀次數:9085次

IBM的開創人Thomas J. Watson曾說: “全球只需要5臺電腦就足夠了”。

Microsoft的開創人Bill Gates曾在1次演講中說:“個人用戶的計算機內存只需640K ”。

Intel開創人之1Gordon Moore曾說:“當價格不變時,集成電路上可容納的晶體管數目,約每隔18個月便會增加1倍,性能也會增加1倍”。

前面兩句話在今天看來實際上是10分荒誕的,而最后那條就是著名的摩爾定律。

hugepages的出現一樣也是由于摩爾定律致使了主機內存愈來愈大,最后不能不對標準pages的改進以提高效力。要了解hugepages首先必須清楚Unix/Linux內存的分配機制。本文從入門的角度介紹Linux的內存分配機制,固然這1部份內容相信很多人都在計算機體系結構這門課程中學到過,這里就重新復習1下。

初期由于程序非常簡單并且使用的內存也非常小,程序的內存地址都是使用程序地址對應物理地址這類這類直接映照的模式,通俗的說就是物理地址是在程序中寫死的。想一想使用匯編直接操作物理地址是多么壯觀的工程呀。對1個大型的軟件系統來講,這部份工作幾近是不可能完成的。后來開始使用“段頁式”的方式來管理內存的尋址。用1個時興的詞來講就是引入了“虛擬化”技術。現代操作系統都會使用受保護的虛擬地址模式(protected virtual address mode)來管理內存,Linux下分為3類地址:邏輯地址(Logic Address)、線性地址(Linear Address)與物理地址(Physics Address)。這3者的對應關系以下所示:    

segmentation and paging

簡單的說就是邏輯地址通過分段機制映照轉化為線性地址,然后線性地址通過分頁機制映照轉化為物理地址。由于這里是介紹hugepages,所以我這里不打算介紹分段機制,主要對分頁機制做簡單的論述。 事實上,地址映照的進程遠遠不止上圖中這么簡單。例如在分頁機制映照中,1般需要經過4級映照,也就是將線性地址映照為物理地址的進程中,需要從內存中讀取最少4次頁目錄表(Page Directory)和頁表 (Page Table)。盡人皆知,CPU寄存器與內存的訪問速率相差最少1個數量級,所以如果使用傳統的分頁機制的開消將會非常大。所以在現代的X86架構中,集成了1種被成為TLB(Translation Lookaside Buffer)的硬件級緩存。TLB讀寫速度非常快,基本和CPU寄存器的速率在1個數量級,而TLB中保緩存了最近使用過的線性地址和物理地址的映照關系。以下圖所示:

tlb 

那末將線性地址映照為物理地址的進程以下:首先到TLB中找到這個條目是不是存在,如果不存在則為TLB miss,然后使用頁表的方式進行尋址,最后把這個映照關系更新到TLB中以備下次使用。由于TLB是大小有限,而1旦出現TLB miss,則其查詢的代價很高,所以現代CPU架構基本都進行了1些優化以提高地址映照的效力。例如:

  • 線性地址到物理地址轉換1開始就選擇同時在TLB和頁表進行查詢,而不經過TLB查找是不是成功的等待;
  • 使用多級TLB和軟TLB,
  • 在CPU context swtch的時候不flush全部TLB。

下面用例子來講明為何使用傳統的 4k大小的頁表相比hugepages對大內存的管理效力會很低。在x86平臺,1條PTE的大小為4Byte;而在x86_64平臺,1條PTE的大小為8Byte。 以下這類場景其實不罕見:

Linux x86_64, SGA大小為100G,使用常規的4k的page,連接到數據庫的進程數約1000。page table1共需要100×1024×1024K/4K=26214400條PTE;

那末26214400條PTE需要100×1024×1024K/4K×8Byte=209715200Byte=200M;

從而1000個進程需要100×1024×1024K/4K×8Byte×1000=209715200000Byte=200G。

計算出來的結果真是使人崩潰,但是事實上在你沒有崩潰之前,數據庫就已由于沒有內存而崩潰了。一樣條件下,如果使用2M的hugepages進行對照,則以上的計算方法變成:

page table1共需要100×1024M/2M=51200條PTE;

那末51200條PTE需要100×1024M/2M×8Byte=409600Byte=400K;

從而1000個進程需要100×1024M/2M×8Byte×1=409600Byte=400K。

綜上,可以看到一樣是1000個進程,一樣是管理100G的SGA,結果卻大不相同。使用傳統的4k大小的page開消居然會到達驚人的200G;而使用2M的hugepages,開消只有400K。 這其中不單單只是對由于單個進程而言,2M page需要的PTE小于4K  page的PTE,最大的1個緣由是在于使用4K page的話,有多少進程使用SGA,就需要多少套PTE,相反如果使用2M page則不管有多少進程使用SGA,同享的都是同1套PTE。

盡人皆知,x86是32位的,所以默許情況下,其可尋址的空間為2的32次方――4G。在X86設計之初,4G內存似乎是1個遙不可及的天文數字,但是摩爾定律打破了這1切,所以軟硬件的設計和開發商必須想出1個對策來解決4G以上不可尋址的問題。注意:這里沒有說4G以上的內存不可尋址,而是說4G以上的地址空間不可尋址,這二者實際上有區分的。例如4G內存的CPU在32bit的Windows(非server版本)能辨認到的內存1般在3G左右。 這其中的主要是主板或操作系統的限制。由于計算機上1些其他的裝備一樣需要可尋址,而這1部份地址需要從總的可尋址空間中預留,例如BIOS芯片的ROM,顯卡上的顯存(RAM)和BIOS(ROM),和PCI、PCI-E裝備上的RAM和ROM都需要占用1定的可尋址的空間。這個叫MMIO(Memory-mapped I/O)。這里有點off the topic了,所以不再贅述,要了解更詳細的緣由和機制,請參考以下鏈接:(RAM limit    PCI hole,   Conventional memory,   3GB barrier )

CPU的設計者碰到了困難了:既要解決4G以上可尋址,又要兼容已有的架構和程序,那該怎樣辦呢?1種最可行的方式就是通過增加擴大地址來解決4G以上的尋址問題。因而Intel引入1個workaround PAE (Physical Address Extensions)機制:增加20位擴大地址,將原來的32位的物理地址擴大為52位,那末可尋址的空間就增加到了2的52次方――4PB,但是實際上x86只使用了其中的36位,也就是X86實際可尋址的物理地址為64G,而轉化的進程為操作系統通過使用頁表將4GB的地址空間映照到大小為64GB的物理地址空間。雖然物理地址為52位,但是線性地址還是32位,所以在這類架構下單個程序/進程使用的內存限制實際上依然還是4G。    注:PSE(Page Size Extension)使得用戶可使用4M的頁表。PAE(Physical Address Extension)使得32位的系統就可以夠使用接近64GB的內存的1種技術。如果PAE和PSE同時使用,則只能使用2M的頁表。x86_64默許使用PAE的擴大―― long mode。

 

pae

通過上圖可知:是不是使用分頁是通過CR0寄存器的PG表示來控制的,如果只使用傳統的分段模式,則將CR0.PG置為0, 如果啟用分頁則需要將PG設置為1。使用page的大小則是由IA32_EFER寄存器LME標志和CR4寄存器的PAE標志和PSE標志控制的,其中IA32_EFER.LME標志控制是不是是不是啟用IA⑶2e模式,而CR4.PAE標志為控制是不是啟用PAE, CR4.PSE標志控制是不是啟用PSE。但是其實不是這3者的任意組合都是存在的,現實中存在的情況為以下幾種: 當前x86/x86_64架構支持的page的大小包括: 4k, 2M, 4M, 1G (操作系統到目前還不支持1G的page table) 以下以x86_64的Linux為例,說明page的大小是如何得到的:在內核源代碼include/asm-x86_64/pgtable.h文件中,可以找到以下宏定義:

#define PMD_SHIFT 21 ... #define PMD_SIZE (1UL <<PMD_SHIFT)

可知使用long mode的page的大小為:

1 << 21 = 2097152

這個移位運算的結果,請參考 http://www.wolframalpha.com/input/?i=1%3C%3C21

需要注意的是page table的大小用戶沒法自定義,在Linux中即便修改這個宏定義,重新編譯內核,也沒法修改page的大小。

Architecture Page Size Huge Page Size Large Page Size
i386 4 KB 4M (2M in PAE mode) 1 GB
IA⑹4 4 KB 4K, 8K, 64K, 256K, 1M, 4M, 16M, 256M -
ppc64 4 KB - 16M
sparc 8 KB - 8K, 64K, 4M, 256M, 2G

在Exadata乃至所有的大內存Linux平臺, hugepages的重要性怎樣強調都不過分。那末為什需要配置hugepages呢?使用hugepages的好處,總結起來包括以下5個方面:

Not swappable (使得SGA不可交換)

為啥SGA是可以被換到虛擬內存的?? Bug 160033 - Kernel swaps out Oracle instead of releasing cache 這個bug終究關閉的狀態為Not a bug, 但是同時在這個bug中提到:   The basic design of the VM in RHEL 4 and RHEL 5 will not allow a complete fix for this issue, only tweaks to make it behave better most of the time.In the upstream kernel (and for RHEL 6), this problem has been addressed with the split LRU VM, which was merged in 2.6.28 and continues to get small fixes and tweaks.  In RHEL 6 this issue should be resolved. Oracle SGA區的內存被swap到磁盤只有到Linux Kernel2.6.28或RHEL 6以后才通過引入新的機制得到解決。而1旦SGA區被換出內存會造成很大的性能抖動。所以在這個問題完全解決之前,絕大多數版本的Linux仍然需要通過hugepages來固定SGA區。(Linux平臺其實不支持通過設置lock_sga和參數的方法來固定SGA, pre_page_sga這個參數存在太多的弊端已強烈不推薦使用)

Relief of TLB pressure: (減輕TLB的壓力)

我們知道TLB是直接緩存虛擬地址到物理地址的緩存表,用于提升性能,省去查找page table減少開消,但是如果出現的大量的TLB miss,必定會給系統的性能帶來較大的負面影響,特別對連續的讀操作。從第2篇文章中我們知道如果使用hugepages能大量減少PTE的數量,也就意味著訪問一樣多的內容需要的PTE會更少,而通常TLB的槽位是有限的,1般只有512個,所以更少的PTE也就意味著更高的TLB的命中率。

Decreased page table overhead: (減少頁表的開消)

在前面的內容中我們通過計算,對4k page和hugepages的頁表開消的進行對比發現,使用hugepages可以極大的減少保護頁表的開消。這篇文章中也提到了1個計算方法:

Each page table entry can be as large as 64 bytes and if we are trying to handle 50GB of RAM, the pagetable will be approximately 800MB in size which is practically will not fit in 880MB size lowmem (in 2.4 kernels

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产精品一区欧美日韩制服 | 亚洲综合春色另类久久 | 亚洲国产视频在线观看 | 中文字幕天堂在线 | 亚洲综合影院 | 不卡精品国产_亚洲人成在线 | 欧美setu| 欧美肥老太太 | 成人gav| 亚洲欧洲第一页 | 国产综合免费视频 | 国产一区日韩二区欧美三 | 精品哟哟哟国产在线观看不卡 | 一区视频在线播放 | 狂野欧美性猛交xxxx | 欧美 亚洲 中文字幕 | 日韩欧美自拍 | 在线观看视频h | 久久www成人看片 | 在线观看亚洲国产 | 欧美一区高清 | 国内精品一区二区三区αv 国内精品一区二区三区东京 | 亚洲 国产 日韩 欧美 | 日本大片免费一级 | 无码精品一区二区三区免费视频 | 欧美高清欧美videosex | 国产婷婷高清在线观看免费 | 在线观看一区二区三区视频 | 波多野结衣在线播放视频 | 久久91综合国产91久久精品 | 国产91区精品福利在线社区 | 亚洲国产精品欧美日韩一区二区 | 午夜dj免费视频观看在线播放 | 日韩一级精品视频在线观看 | 欧美性猛交xxxx | 黄色毛片视频网站 | 国产在线精品一区二区高清不卡 | 久久久久色 | 最近最新视频中文字幕4 | 亚洲午夜免费视频 | 狠狠操视频网 |