為什么 Linux 系統(tǒng)默認(rèn)頁(yè)大小是 4KB
掃描二維碼
隨時(shí)隨地手機(jī)看文章
轉(zhuǎn)自:真沒什么裸邏輯
編輯整理:strongerHuang
我們都知道 Linux 會(huì)以頁(yè)為單位管理內(nèi)存,無論是將磁盤中的數(shù)據(jù)加載到內(nèi)存中,還是將內(nèi)存中的數(shù)據(jù)寫回磁盤,操作系統(tǒng)都會(huì)以頁(yè)面為單位進(jìn)行操作,哪怕我們只向磁盤中寫入一個(gè)字節(jié)的數(shù)據(jù),我們也需要將整個(gè)頁(yè)面中的全部數(shù)據(jù)刷入磁盤中。
Linux 同時(shí)支持正常大小的內(nèi)存頁(yè)和大內(nèi)存頁(yè)(Huge Page),絕大多數(shù)處理器上的內(nèi)存頁(yè)的默認(rèn)大小都是 4KB,雖然部分處理器會(huì)使用 8KB、16KB 或者 64KB 作為默認(rèn)的頁(yè)面大小,但是 4KB 的頁(yè)面仍然是操作系統(tǒng)默認(rèn)內(nèi)存頁(yè)配置的主流;除了正常的內(nèi)存頁(yè)大小之外,不同的處理器上也包含不同大小的大頁(yè)面,我們?cè)?x86 處理器上就可以使用 2MB 的內(nèi)存頁(yè)。
4KB 的內(nèi)存頁(yè)其實(shí)是一個(gè)歷史遺留問題,在上個(gè)世紀(jì) 80 年代確定的 4KB 一直保留到了今天。雖然今天的硬件比過去豐富了很多,但是我們?nèi)匀谎赜昧诉^去主流的內(nèi)存頁(yè)大小。如下圖所示,裝過機(jī)的人應(yīng)該對(duì)這里的內(nèi)存條非常熟悉:
圖 1 - 隨機(jī)存取內(nèi)存
在今天,4KB 的內(nèi)存頁(yè)大小可能不是最佳的選擇,8KB 或者 16KB 說不定是更好的選擇,但是這是過去在特定場(chǎng)景下做出的權(quán)衡。我們?cè)谶@篇文章中不要過于糾結(jié)于 4KB 這個(gè)數(shù)字,應(yīng)該更重視決定這個(gè)結(jié)果的幾個(gè)因素,這樣當(dāng)我們?cè)谟龅筋愃茍?chǎng)景時(shí)才可以從這些方面考慮當(dāng)下最佳的選擇,我們?cè)谶@篇文章中會(huì)介紹以下兩個(gè)影響內(nèi)存頁(yè)大小的因素,它們分別是:
過小的頁(yè)面大小會(huì)帶來較大的頁(yè)表項(xiàng)增加尋址時(shí) TLB(Translation lookaside buffer)的查找速度和額外開銷;
過大的頁(yè)面大小會(huì)浪費(fèi)內(nèi)存空間,造成內(nèi)存碎片,降低內(nèi)存的利用率;
上個(gè)世紀(jì)在設(shè)計(jì)內(nèi)存頁(yè)大小時(shí)充分考慮了上述的兩個(gè)因素,最終選擇了 4KB 的內(nèi)存頁(yè)作為操作系統(tǒng)最常見的頁(yè)大小,我們接下來將詳細(xì)介紹以上它們對(duì)操作系統(tǒng)性能的影響。
頁(yè)表項(xiàng)
我們?cè)?為什么 Linux 需要虛擬內(nèi)存 一文中曾經(jīng)介紹過 Linux 中的虛擬內(nèi)存,每個(gè)進(jìn)程能夠看到的都是獨(dú)立的虛擬內(nèi)存空間,虛擬內(nèi)存空間只是邏輯上的概念,進(jìn)程仍然需要訪問虛擬內(nèi)存對(duì)應(yīng)的物理內(nèi)存,從虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換就需要使用每個(gè)進(jìn)程持有頁(yè)表。
為了存儲(chǔ) 64 位操作系統(tǒng)中 128 TiB 虛擬內(nèi)存的映射數(shù)據(jù),Linux 在 2.6.10 中引入了四層的頁(yè)表輔助虛擬地址的轉(zhuǎn)換[,在 4.11 中引入了五層的頁(yè)表結(jié)構(gòu),在未來還可能會(huì)引入更多層的頁(yè)表結(jié)構(gòu)以支持 64 位的虛擬地址。
圖 2 - 四層頁(yè)表結(jié)構(gòu)
在如上圖所示的四層頁(yè)表結(jié)構(gòu)中,操作系統(tǒng)會(huì)使用最低的 12 位作為頁(yè)面的偏移量,剩下的 36 位會(huì)分四組分別表示當(dāng)前層級(jí)在上一層中的索引,所有的虛擬地址都可以用上述的多層頁(yè)表查找到對(duì)應(yīng)的物理地址。
因?yàn)椴僮飨到y(tǒng)的虛擬地址空間大小都是一定的,整片虛擬地址空間被均勻分成了 N 個(gè)大小相同的內(nèi)存頁(yè),所以內(nèi)存頁(yè)的大小最終會(huì)決定每個(gè)進(jìn)程中頁(yè)表項(xiàng)的層級(jí)結(jié)構(gòu)和具體數(shù)量,虛擬頁(yè)的大小越小,單個(gè)進(jìn)程中的頁(yè)表項(xiàng)和虛擬頁(yè)也就越多。
因?yàn)槟壳暗奶摂M頁(yè)大小為 4096 字節(jié),所以虛擬地址末尾的 12 位可以表示虛擬頁(yè)中的地址,如果虛擬頁(yè)的大小降到了 512 字節(jié),那么原本的四層頁(yè)表結(jié)構(gòu)或者五層頁(yè)表結(jié)構(gòu)會(huì)變成五層或者六層,這不僅會(huì)增加內(nèi)存訪問的額外開銷,還會(huì)增加每個(gè)進(jìn)程中頁(yè)表項(xiàng)占用的內(nèi)存大小。
碎片化
因?yàn)閮?nèi)存映射設(shè)備會(huì)在內(nèi)存頁(yè)的層面工作,所以操作系統(tǒng)認(rèn)為內(nèi)存分配的最小單元就是虛擬頁(yè)。哪怕用戶程序只是申請(qǐng)了 1 字節(jié)的內(nèi)存,操作系統(tǒng)也會(huì)為它申請(qǐng)一個(gè)虛擬頁(yè),如下圖所示,如果內(nèi)存頁(yè)的大小為 24KB,那么申請(qǐng) 1 字節(jié)的內(nèi)存會(huì)浪費(fèi) ~99.9939% 的空間。
圖 3 - 大內(nèi)存的碎片化
隨著內(nèi)存頁(yè)大小的增加,內(nèi)存的碎片化情況會(huì)越來越嚴(yán)重,小的內(nèi)存頁(yè)會(huì)減少內(nèi)存空間中的內(nèi)存碎片,提高內(nèi)存的利用率。上個(gè)世紀(jì)的內(nèi)存資源還沒有像今天這么豐富,在大多數(shù)情況下,內(nèi)存都不是限制程序運(yùn)行的資源,多數(shù)的在線服務(wù)都需要更多的CPU,而不是更多的內(nèi)存。不過在上個(gè)世紀(jì)內(nèi)存其實(shí)也是稀缺資源,所以提高稀缺資源的利用率是我們不得不考慮的事情:
圖 4 - 內(nèi)存的價(jià)格
上個(gè)世紀(jì)八九十年代的內(nèi)存條只有 512KB 或者 2MB,價(jià)格也貴得離譜,但是幾 GB 的內(nèi)存在今天卻非常常見,所以雖然內(nèi)存的利用率仍然十分重要,但是在內(nèi)存的價(jià)格大幅降低的今天,碎片化的內(nèi)存不再是需要解決的關(guān)鍵問題了。
除了內(nèi)存的利用率之外,較大的內(nèi)存頁(yè)也會(huì)增加內(nèi)存拷貝時(shí)的額外開銷,因?yàn)?Linux 上的寫時(shí)拷貝機(jī)制,在多個(gè)進(jìn)程共享同一塊內(nèi)存時(shí),當(dāng)其中的一個(gè)進(jìn)程修改了共享的虛擬內(nèi)存會(huì)觸發(fā)內(nèi)存頁(yè)的拷貝,這時(shí)操作系統(tǒng)的內(nèi)存頁(yè)越小,寫時(shí)拷貝帶來的額外開銷也就越小。
總結(jié)
就像我們?cè)谏厦嫣岬降模?KB 的內(nèi)存頁(yè)是上個(gè)世紀(jì)決定的默認(rèn)設(shè)置,從今天的角度來看,這很可能已經(jīng)是錯(cuò)誤的選擇了,arm64、ia64 等架構(gòu)已經(jīng)可以支持 8KB、16KB 等大小的內(nèi)存頁(yè),隨著內(nèi)存的價(jià)格變得越來越低、系統(tǒng)的內(nèi)存變得越來越大,更大的內(nèi)存可能是操作系統(tǒng)更好的選擇,我們重新回顧一下兩個(gè)決定內(nèi)存頁(yè)大小的要素:
過小的頁(yè)面大小會(huì)帶來較大的頁(yè)表項(xiàng)增加尋址時(shí) TLB(Translation lookaside buffer)的查找速度和額外開銷,但是也會(huì)減少程序中的內(nèi)存碎片,提高內(nèi)存的利用率;
過大的頁(yè)面大小會(huì)浪費(fèi)內(nèi)存空間,造成內(nèi)存碎片,降低內(nèi)存的利用率,但是可以較少進(jìn)程中的頁(yè)表項(xiàng)以及 TLB 的尋址時(shí)間;
到最后,我們還是來看一些比較開放的相關(guān)問題,有興趣的讀者可以仔細(xì)思考一下下面的問題:
Linux 中的扇區(qū)、塊和頁(yè)都有什么區(qū)別和聯(lián)系?
Linux 中的塊大小是如何決定的?常見的大小有哪些?
長(zhǎng)按前往圖中包含的公眾號(hào)關(guān)注
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!