LWN:針對(duì)多層內(nèi)存系統(tǒng)重新進(jìn)行NUMA平衡!
關(guān)注了就能看到更多這么棒的文章哦~
NUMA rebalancing on tiered-memory systems
May 2, 2022
This article was contributed by David Vernet
DeepL assisted translation
https://lwn.net/Articles/893024/
傳統(tǒng)的 NUMA 架構(gòu)是圍繞 node (節(jié)點(diǎn))建立的,每個(gè)節(jié)點(diǎn)都包含一組 CPU 和一些本地內(nèi)存,所有的節(jié)點(diǎn)或多或少都是平等的。但最近,"tiered-memory (分層內(nèi)存)" 的 NUMA 系統(tǒng)開始出現(xiàn),其中包括無 CPU 的節(jié)點(diǎn),也就是只包含持久性內(nèi)存(persistent memory),而不是(更快但更昂貴的)DRAM。這種內(nèi)存的一個(gè)可能用途就是保存不經(jīng)常使用的 page,而不是強(qiáng)行把這些 page 換出到后備存儲(chǔ)設(shè)備上。不過,在這個(gè)使用案例中出現(xiàn)了一個(gè)有趣的問題:內(nèi)核如何管理 page 在較快和較慢內(nèi)存之間的移動(dòng)?最近的幾個(gè) patch set 對(duì)這些系統(tǒng)上的內(nèi)存再平衡問題采取了不同的方法。
Migration and reclaim
內(nèi)核使用一種叫做 "NUMA hint-faulting" 的技術(shù)來檢測(cè)確定某一個(gè) page 是否需要被遷移。某個(gè) task 的地址空間范圍會(huì)被周期性地取消映射(unmap),這樣今后對(duì)該范圍內(nèi)的 page 的訪問就會(huì)觸發(fā)一個(gè) page fault。當(dāng) page fault 發(fā)生時(shí),內(nèi)存管理子系統(tǒng)就可以使用觸發(fā) page fault 的 CPU 的位置來確定該 page 是否需要被遷移到包含該 CPU 的節(jié)點(diǎn)去。完全沒有 fault 的話就說明該 page 正在受到冷遇,并可能在 reclaim 的時(shí)候被遷移到一個(gè)慢層(slow-tier)節(jié)點(diǎn)。隨著工作負(fù)載的運(yùn)行和訪問模式的改變,page 在常用與不常用(hot and cold)之間經(jīng)常轉(zhuǎn)換,也就會(huì)相應(yīng)地在快速和慢速 NUMA 節(jié)點(diǎn)之間遷移了。
內(nèi)存回收(memory reclaim)是由一個(gè) "watermark" 系統(tǒng)驅(qū)動(dòng)的,該系統(tǒng)試圖至少保持最低數(shù)量的 free page 可供使用。當(dāng)請(qǐng)求分配內(nèi)存時(shí),內(nèi)核會(huì)將正在進(jìn)行分配的節(jié)點(diǎn)中的可用 page 數(shù)量與 zone watermark threshold 進(jìn)行比較。如果分配后節(jié)點(diǎn)中的空閑頁數(shù)低于 watermark 所說的閾值,那么 kswapd 內(nèi)核線程就會(huì)被喚醒來異步地掃描并從節(jié)點(diǎn)中回收內(nèi)存 page。這就可以在節(jié)點(diǎn)的內(nèi)存壓力導(dǎo)致分配被阻塞從而發(fā)生 direct reclaim 之前就預(yù)先釋放內(nèi)存。
內(nèi)核中的 zone watermark 是根據(jù) host 的內(nèi)存情況來靜態(tài)地決定 size 的。內(nèi)存較少的系統(tǒng)中 zone watermark 會(huì)比較低,而內(nèi)存較大的系統(tǒng)的 watermark 會(huì)較高。從直覺來說,這種差異化是有必要的。如果你有一臺(tái)擁有大量內(nèi)存的機(jī)器,那么比起擁有很少內(nèi)存的機(jī)器來說,reclaim 會(huì)更早觸發(fā),因?yàn)轭A(yù)期在擁有更多內(nèi)存的系統(tǒng)上應(yīng)用程序會(huì)更積極地申請(qǐng)內(nèi)存。然而,使用靜態(tài)的閾值也有缺點(diǎn)。在 tiered-memory 系統(tǒng)之中,如果一個(gè)節(jié)點(diǎn)的閾值太低,快速節(jié)點(diǎn)可能不會(huì)積極地 reclaim 回收內(nèi)存,也就沒有空間可以把慢速節(jié)點(diǎn)上的 hot page 提級(jí)遷移過來。
Optimizing reclaim and demotion
Huang Ying 最近的一個(gè) patch 就是針對(duì)性地解決這個(gè)問題的。這項(xiàng)工作的基礎(chǔ)前提是,在具有多種內(nèi)存類型的系統(tǒng)上,工作負(fù)載的 working-set (工作集,也就是各個(gè)工作者的集合)size 經(jīng)常會(huì)超過系統(tǒng)中快速 DRAM 的總量。這是有道理的。如果一個(gè)系統(tǒng)沒有 overcommit (也就是承諾了比真實(shí)內(nèi)存容量還多的 DRAM),那么就完全沒有必要使用其他類型的內(nèi)存了。
這一點(diǎn)就說明,在 tiered-memory 系統(tǒng)中,當(dāng)應(yīng)用程序訪問時(shí),內(nèi)存 page 會(huì)在快慢內(nèi)存節(jié)點(diǎn)之間不斷遷移。如果快速節(jié)點(diǎn)接近容量上限了,內(nèi)核就無法在 rebalancing 過程中把全局性的 hot page 提級(jí)到這些快速節(jié)點(diǎn)上了;由于 hot page 一直駐留在慢速節(jié)點(diǎn)上,導(dǎo)致訪問延遲變高了,這是不太合適的。因此,這里的訣竅在于需要確保能夠從快速節(jié)點(diǎn)回收到足夠的 page,這樣除了為未來的分配騰出空間外,快速節(jié)點(diǎn)也有足夠的空間來把慢速節(jié)點(diǎn)的 hot page 遷移過來。
Ying 的 patch set 通過引入一個(gè)新的 WMARK_PROMO watermark 來解決這個(gè)需求,這個(gè) watermark 比(以前最高的)WMARK_HIGH 限值還要高。當(dāng)一個(gè) page 由于內(nèi)存壓力原因而無法被遷移到更快的節(jié)點(diǎn)時(shí),kswapd 會(huì)被喚醒來回收內(nèi)存,確保達(dá)到這個(gè)新加入的 WMARK_PROMO 閾值。這種稍顯激進(jìn)的回收策略能更好地確保有足夠的空間將 hot page 從慢速內(nèi)存節(jié)點(diǎn)提級(jí)遷移到快速內(nèi)存節(jié)點(diǎn),從而更好地適應(yīng) tiered memory 系統(tǒng)中常見的 working set。
The controversy of statically sized watermarks
雖然添加 WMARK_PROMO watermark 提高了快速節(jié)點(diǎn)上有足夠空間把較慢節(jié)點(diǎn)上的 hot page 遷移過來的機(jī)會(huì),但人們不得不懷疑是否應(yīng)該重新審視靜態(tài) watermark 這個(gè)概念。如果所選擇的 watermark 閾值足夠高,能確保 page 可以被提級(jí)遷移到快速節(jié)點(diǎn),那么一個(gè)高于必要值的閾值也會(huì)使一些 DRAM 未被使用,從而讓應(yīng)用程序的性能受到負(fù)面影響。這里需要一個(gè)新的 watermark 的事實(shí)就表明了問題的性質(zhì),也就是很大程度上需要取決于系統(tǒng)本身的特點(diǎn),以及它所運(yùn)行的工作負(fù)載。
在對(duì)該補(bǔ)丁的 review 中討論了使用靜態(tài) watermark 的弊端。例如,在 Ying 的補(bǔ)丁的早期版本中,硬性規(guī)定了 reclaim 時(shí)所需的額外 page 數(shù)量應(yīng)該是比 WMARK_HIGH 大 10MB,Zi Yan 質(zhì)疑這樣的數(shù)值是否合理:
為什么是 10MB?10MB 大到足以避免對(duì)快速內(nèi)存造成內(nèi)存壓力嗎?這個(gè)數(shù)字似乎像是個(gè)臨時(shí)方案,可能只在你的測(cè)試機(jī)器上有效果。
Ying 承認(rèn),10MB 的數(shù)值很難證實(shí)是合理的,而且在目前的實(shí)現(xiàn)之外還有改進(jìn)的余地。根據(jù) Johannes Weiner 的建議,這個(gè)閾值后來被改為單獨(dú)的 WMARK_PROMO 水位線,他還指出,有另一個(gè)選擇是讓提級(jí)遷移的動(dòng)作來動(dòng)態(tài)地按需提高 kswapd watermark。這就能避免 DRAM 未被充分利用的問題,當(dāng)然這也是以增加復(fù)雜性為代價(jià)的。
漸進(jìn)式的修改當(dāng)然沒有錯(cuò),盡量堅(jiān)持使用最簡單的方法(在必須要實(shí)現(xiàn)復(fù)雜方案之前)也沒有錯(cuò)。然而,我們關(guān)心的是,內(nèi)核最終是否需要一個(gè)更加動(dòng)態(tài)和靈活的框架來進(jìn)行 page reclaim 以及 page migration 決策。
Avoiding page ping-pong
除了要求快速節(jié)點(diǎn)有足夠的空間用于把其他 page 提級(jí)遷移過來之外,還有一個(gè)問題是分層內(nèi)存系統(tǒng)所特有的。在傳統(tǒng)的 NUMA 設(shè)置中,應(yīng)用程序 working set 的大小通常是適合于運(yùn)行在一個(gè)或多個(gè)節(jié)點(diǎn)上的。一旦應(yīng)用程序達(dá)到穩(wěn)定狀態(tài),并且大多數(shù)(或者所有的)page 都正確地位于它們本地訪問的節(jié)點(diǎn)上,那么遷移就會(huì)逐漸減少。不過,tiered memory 系統(tǒng)上的應(yīng)用并不是這樣的,因?yàn)樗鼈兊?working set 可能無法完全在它們所運(yùn)行的 NUMA 節(jié)點(diǎn)放得下。當(dāng)應(yīng)用程序訪問這些 page 時(shí),它們并沒有達(dá)到一個(gè)穩(wěn)定的狀態(tài),而是不斷地在慢速和快速的 NUMA 節(jié)點(diǎn)之間來回切換。
這也是一個(gè)相關(guān)問題,但與 Ying 的 patch set 所解決的問題不同。新的 watermark 可以確??焖俟?jié)點(diǎn)上有足夠的空間讓 hot page 從慢速節(jié)點(diǎn)上遷移過來,但并沒有阻止 page 在慢速節(jié)點(diǎn)和快速節(jié)點(diǎn)之間不斷地、過于積極地進(jìn)行遷移。如果執(zhí)行遷移的開銷超過了把 page 放在在本地 DRAM 節(jié)點(diǎn)上的訪問延遲變小而獲得的性能優(yōu)勢(shì),那么 page 遷移的速度顯然就需要調(diào)整了。對(duì)于如何解決這個(gè)問題,已經(jīng)有很多建議。
Ying 提出的一個(gè)建議是記錄慢速內(nèi)存中的一個(gè) page 被 unmap 來產(chǎn)生 NUMA hint fault 和在內(nèi)存訪問中實(shí)際觀察到該 fault 之間的時(shí)間差。該 page 被 unmap 之后的時(shí)間越短,那么這個(gè) page 就越有可能是 hot 狀態(tài)。該時(shí)間可以跟一些閾值(可由系統(tǒng)管理員調(diào)整)進(jìn)行比較,只有當(dāng)時(shí)間差在該閾值內(nèi)時(shí),該 page 才會(huì)被提升。
雖然訪問以來的時(shí)間感覺是量化頁面熱度的一種自然方式,但這種方法也相當(dāng)復(fù)雜,需要添加大量的新代碼。定義一個(gè)頁面被認(rèn)為是 "熱 "的閾值應(yīng)該是什么,這個(gè)問題也不清楚;可能需要由系統(tǒng)管理員進(jìn)行調(diào)整。一個(gè)后續(xù)的補(bǔ)丁提出了一種根據(jù)遷移量動(dòng)態(tài)調(diào)整閾值的方法,但它也相當(dāng)復(fù)雜。
Hasan Al Maruf 在一個(gè) patch 中提出了另一個(gè)方法。當(dāng)一個(gè) page 被降級(jí)時(shí),會(huì)從 active LRU list 中移除掉,并放到 inactive LRU list 中。Al Maruf 的 patch 更新了 NUMA hint fault 處理程序(handler),來檢查某個(gè) page 是否處于這種 inactive 狀態(tài),如果是,則將其移至 active 狀態(tài),并推遲到后續(xù) fault 發(fā)生時(shí)再進(jìn)行提級(jí)遷移。如果該 page 再次被訪問到,那么看起來它就是在 active LRU 上,然后就會(huì)發(fā)生提級(jí)遷移。這個(gè)解決方案的優(yōu)點(diǎn)是,它使用了內(nèi)核中現(xiàn)有的機(jī)制來跟蹤 page 的 hot 程度。隨著內(nèi)存壓力的增加以及有更多的 page 被回收,會(huì)有更多的 page 被移到 inactive LRU list 中,從而導(dǎo)致 page 提級(jí)遷移會(huì)按比例被抑制。
目前還沒有就選擇哪種解決方案達(dá)成共識(shí),不過 Al Maruf 的 patch set 很可能會(huì)被接受,因?yàn)樗芎唵?,而且使用了現(xiàn)有的機(jī)制來跟蹤 page 的 hot 程度。雖然預(yù)計(jì)該解決方案不會(huì)引起爭議,但最近會(huì)有 Linux Storage, Filesystems, and Memory-Management Summit 就要召開了,開發(fā)人員可以在那里來面對(duì)面地討論每種方法的優(yōu)點(diǎn)了。
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~
