LWN: 利用 DAMON 進(jìn)行內(nèi)存主動回收!
關(guān)注了就能看到更多這么棒的文章哦~
Using DAMON for proactive reclaim
By Jonathan Corbet
July 23, 2021
DeepL assisted translation
https://lwn.net/Articles/863753/
DAMON patch set 在 2020 年初的時(shí)候 LWN 曾經(jīng)第一次報(bào)道過。而這項(xiàng)工作現(xiàn)在已經(jīng)進(jìn)入第 34 版了。它的目的是能夠有效收集 Linux 系統(tǒng)的內(nèi)存使用的模式相關(guān)的信息。然后使用這些數(shù)據(jù)來影響內(nèi)核的內(nèi)存管理子系統(tǒng)的行為,比如其中一種可能的方法用法是更積極地回收那些未被使用的內(nèi)存。為此,DAMON 的作者 SeongJae Park 提出了一個(gè)基于 DAMON 的機(jī)制來實(shí)現(xiàn)用戶可以控制的主動回收。
DAMON 的核心思想是使用一種采樣(sampling)技術(shù)來確定哪些內(nèi)存是正在使用的,哪些是正在閑置的。進(jìn)程的虛擬地址空間被分成不同的區(qū)域(region),劃分出來的區(qū)域的 size 并不相同,而是根據(jù)活躍情況來劃分的。接下來隨著時(shí)間的推移會對最繁忙的區(qū)域進(jìn)行更細(xì)地劃分,從而進(jìn)行更精細(xì)的監(jiān)控。在每個(gè)區(qū)域內(nèi)會隨機(jī)選擇一個(gè) page 進(jìn)行監(jiān)控,它的活躍程度就被認(rèn)為是代表了整個(gè)區(qū)域的情況。在需要的時(shí)候,DAMON 會以直方圖(histogram)的形式生成一份報(bào)告來報(bào)告每個(gè)內(nèi)存區(qū)域的繁忙程度。
Putting DAMON to work
一開始設(shè)立這項(xiàng)工作的時(shí)候,目標(biāo)就是希望使用 DAMON 數(shù)據(jù),可以通過調(diào)整內(nèi)存管理子系統(tǒng)的行為來提高系統(tǒng)性能。最初的例子是 DAMON operation schemes(DAMOS)這組 patch,它增加了機(jī)制來根據(jù)使用模式進(jìn)行各種 madvise() 調(diào)用。因此,比如說就可以提出 request 來將很少使用的內(nèi)存換出(page out)出來,或者對那些范圍很大的活躍區(qū)域來使用 huge page 管理。
主動回收(proactive-reclaim)補(bǔ)丁是基于 DAMOS 的,希望能讓內(nèi)存管理的行為更加積極主動。這項(xiàng)工作主要是開發(fā)了一個(gè)新的 kernel module,用來監(jiān)測 DAMON 的數(shù)據(jù),找到那些在這段時(shí)間內(nèi)沒有被訪問過的內(nèi)存區(qū)域,從而主動回收這些區(qū)域內(nèi)的 page 頁面來用于其他用途,哪怕系統(tǒng)目前沒有感到內(nèi)存壓力也這樣做。其結(jié)果令人印象深刻,可以看到減少了 latency 的峰值,以及減少了 direct reclaim 的耗時(shí),從而讓系統(tǒng)的整體性能得到了重大改進(jìn)。不過,要達(dá)到這個(gè)目的話還需要做一些改動。
開發(fā)工作的第一步是為 DAMOS 添加一個(gè) "pageout" 方案,允許直接調(diào)用內(nèi)存回收動作(reclaim operation)。這與之前實(shí)現(xiàn)的 madvise()機(jī)制不同,因?yàn)樗遣僮魑锢眄撁娴模?madvise()是針對單個(gè)進(jìn)程的虛擬地址空間。正如 madvise() 的名字所說的,它僅僅是建議而已,而新的 pageout scheme 方案會直接觸發(fā) reclaim。因此,對于真正將 page 從內(nèi)存中換出這個(gè)效果方面它要更加有效。
Makeing proactive reclaim efficient
值得注意的是,主動回收(proactive reclaim)并不是一個(gè)新想法。例如 2019 年 Linux 存儲、文件系統(tǒng)和內(nèi)存管理峰會(2019 Linux Storage, Filesystem, and Memory-Management Summit)上就討論過這個(gè)問題。當(dāng)時(shí)與會的開發(fā)人員一致認(rèn)為,對那些看起來未真正使用的內(nèi)存進(jìn)行主動回收會更有價(jià)值。畢竟,這就是內(nèi)存管理子系統(tǒng)一直在努力要實(shí)現(xiàn)的功能。問題是這個(gè)動作的開銷成本。因?yàn)橐朊芮斜O(jiān)視系統(tǒng)從而找出哪些 page 是真正閑置的,這需要反復(fù)掃描觀察所有的內(nèi)存,這個(gè)開銷很大。在許多情況下(其實(shí)應(yīng)該是大多數(shù)情況),這種開銷會超過精準(zhǔn)主動回收 page 帶來的好處,所以這項(xiàng)工作并沒有進(jìn)入 mainline kernel。
DAMON 的主要目標(biāo)就是讓這種監(jiān)控開銷變小。Park 在提出 proactive-reclaim 的郵件中這樣描述:
它的監(jiān)控開銷可以得到自適應(yīng)的控制,從而使得監(jiān)控開銷可以最小化。它還使得這個(gè)開銷的上限可由客戶來進(jìn)行配置,無論需要監(jiān)控的目標(biāo)內(nèi)存的整體大小是多少。在每 5 毫秒監(jiān)控一次具有 70GB 內(nèi)存的生產(chǎn)系統(tǒng)時(shí),它消耗的 CPU 時(shí)間不到 1%。
這個(gè)監(jiān)測的粒度是可以配置的,從而使得開銷能在用戶可以接受的范圍內(nèi)。當(dāng)然,開銷上限配置得越低,就會導(dǎo)致結(jié)果越不準(zhǔn)確。我們希望 DAMON 的效率可以克服人們對主動回收的開銷的反對,但這并不能完全解決這個(gè)問題。內(nèi)存回收操作本身也有成本,我們也不能讓這個(gè)成本失去控制。
為了避免這個(gè)問題,proactive-reclaim patch set 增加了一些控制節(jié)點(diǎn),允許對新機(jī)制進(jìn)行配置。其中一個(gè)控制節(jié)點(diǎn)直接控制了在每個(gè)時(shí)間單位中(具體多長時(shí)間也是可以設(shè)置的)可以操作的內(nèi)存大小(單位是字節(jié)數(shù))。等達(dá)到這個(gè)配額之后,proactive-reclaim 將主動暫停工作,等到下一個(gè)時(shí)間段再開始。為了避免一直卡在某個(gè)內(nèi)存區(qū)域,proactive-reclaim 在觸發(fā)了這個(gè) limit 之后,在下一個(gè)時(shí)間段會跳轉(zhuǎn)到新的一個(gè)區(qū)域。
除此之外還有一個(gè)設(shè)置時(shí)間配額的控制節(jié)點(diǎn),即每個(gè)時(shí)間段允許 proactive-reclaim 利用多少 CPU 時(shí)間。同樣,如果超過了這個(gè)時(shí)間的話,reclaim 工作將會暫停,直到下一個(gè)時(shí)間段再開始。不過還有另一個(gè)控制節(jié)點(diǎn),可以允許在系統(tǒng)的 free 內(nèi)存超過一個(gè)設(shè)定值的時(shí)候?qū)⒄麄€(gè)機(jī)制暫停。畢竟,如果空閑內(nèi)存已經(jīng)超過了需求,那么繼續(xù)占用系統(tǒng)資源來強(qiáng)制釋放內(nèi)存就沒有價(jià)值了。有趣的是,如果 free 內(nèi)存太少的話,proactive-reclaim 也可以暫停。在這種情況下內(nèi)存管理子系統(tǒng)已經(jīng)在主動進(jìn)行內(nèi)存回收了,這個(gè) proactive 機(jī)制機(jī)制最好不要插手。
最后,還有一個(gè)優(yōu)先級判定機(jī)制。根據(jù) quote 參數(shù)的設(shè)置,proactive-reclaim 很可能無法在實(shí)際給它的時(shí)間內(nèi)完成所有的內(nèi)存檢查和回收動作,這種情況下就可以考慮把工作集中在那些可以獲得最大利益的區(qū)域了。用戶可以調(diào)整另一組控制節(jié)點(diǎn),根據(jù)各個(gè)區(qū)域的大小、存在時(shí)長和訪問頻率,來把內(nèi)存回收工作聚焦在一些特定區(qū)域上。
Not for everybody
所有這些工作合在一起建立了一個(gè)全新的機(jī)制,其中有很多參數(shù)需要針對性的調(diào)整。而且,有可能會損害系統(tǒng)的性能而不是提高性能。這組 patch 中的 documentation patch 詳細(xì)描述了如何使用這個(gè)新的 module。它似乎不太會是普通用戶希望使用的功能。
不過,對于那些需要從他們的系統(tǒng)得到最佳性能、并且有時(shí)間微調(diào)系統(tǒng)的管理員來說,proactive reclaim 可能會帶來一些顯著的好處。與 patch set 一起發(fā)布的那些 benchmark 的結(jié)果就說明,不受限制的 reclaim module 可以釋放近一半的可用內(nèi)存,但這要付出一些代價(jià):將近 12% 的 CPU 專門用于頁面回收工作,同時(shí) workload 運(yùn)行速度會有略高于 5% 的降低(可能是由于被回收的內(nèi)存在后續(xù)再次需要時(shí)增加了 paging 換入操作)。通過設(shè)置一些限制就可以大大減少系統(tǒng)開銷,同時(shí)還仍然能得到獲得大多數(shù) free memory 的好處,利用這些來執(zhí)行其他的 workload。不過,最佳的參數(shù)似乎很可能在很大程度上取決于 workload 的特性。
proactive-reclaim 工作在郵件列表中已經(jīng)是第三輪討論了,但 DAMON 本身已經(jīng)發(fā)布了 34 次,沒有明確的跡象表明它何時(shí)會被合并到 mainline 中(甚至是否會被合入都不確定)。Park 顯然希望能看到有一些進(jìn)展,因此 patch 中一開始就要求大家對 DAMON 的工作進(jìn)行 review。如果 DAMON 以及基于它的這些機(jī)制要想進(jìn)入 mainline,那么就需要得到更多的 review,以及能看到人們對這項(xiàng)工作的更多興趣。
全文完
LWN 文章遵循 CC BY-SA 4.0 許可協(xié)議。
長按下面二維碼關(guān)注,關(guān)注 LWN 深度文章以及開源社區(qū)的各種新近言論~
