最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

一篇搞懂KSM機(jī)制剖析 — Linux內(nèi)核中的內(nèi)存去耦合

2022-04-08 14:12 作者:補(bǔ)給站Linux內(nèi)核  | 我要投稿

簡(jiǎn)介:作為一個(gè)系統(tǒng)管理程序(hypervisor),Linux 有幾個(gè)創(chuàng)新,2.6.32 內(nèi)核中一個(gè)有趣的變化是 KSM(Kernel Samepage Merging) 允許這個(gè)系統(tǒng)管理程序通過合并內(nèi)存頁(yè)面來增加并發(fā)虛擬機(jī)的數(shù)量。本文探索 KSM 背后的理念(比如存儲(chǔ)去耦合)、KSM 的實(shí)現(xiàn)、以及如何管理 KSM。

服務(wù)器虛擬化

  • 虛擬化技術(shù)從上世紀(jì) 60 年代開始出現(xiàn),經(jīng)由 IBM? System/360? 大型機(jī)得以流行。50 年過后,虛擬化技術(shù)取得了跨越式發(fā)展,使得多個(gè)操作系統(tǒng)和應(yīng)用程序共享一個(gè)服務(wù)器成為可能。這一特殊用途(稱為服務(wù)器虛擬化)正在演變?yōu)閿?shù)據(jù)中心,因?yàn)閱?個(gè)物理機(jī)能夠用于托管 10 個(gè)(一般情況)或更多虛擬機(jī)(VM),如圖 1 所示。這種虛擬化使基礎(chǔ)設(shè)施更動(dòng)態(tài)、更省電、(因而也)更經(jīng)濟(jì)。


圖 1. 通過虛擬化進(jìn)行的服務(wù)器合并


  • 頁(yè)面都是相同的。假如操作系統(tǒng)和應(yīng)用程序代碼以及常量數(shù)據(jù)在 VMs 之間相同,那么這個(gè)特點(diǎn)就很有用。當(dāng)頁(yè)面惟一時(shí),它們可以被合并,從而釋放內(nèi)存,供其他應(yīng)用程序使用。圖 2 演示了內(nèi)存共享,并展示了在內(nèi)容相同的 VMs 之間共享頁(yè)面時(shí)更多可用閑置內(nèi)存的好處。


圖 2. 跨 VMs 的內(nèi)存共享


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。∏?00名進(jìn)群領(lǐng)取,額外贈(zèng)送一份價(jià)值699的內(nèi)核資料包(含視頻教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)?



  • 本文描述的特性非常新;因此,其名稱經(jīng)歷了一些變化。您將發(fā)現(xiàn)這個(gè) Linux 內(nèi)核特性稱為 Kernel Shared Memory 或 Kernel Samepage Merging。

  • 您很快就會(huì)發(fā)現(xiàn),盡管 Linux 中的內(nèi)存共享在虛擬環(huán)境中有優(yōu)勢(shì)(KSM 最初設(shè)計(jì)用于基于內(nèi)核的虛擬機(jī)),但它在非虛擬環(huán)境中仍然有用。事實(shí)上,KSM 甚至在嵌入式 Linux 系統(tǒng)中也有用處,表明了這種方法的靈活性。下面,我們將探索這種 Linux 內(nèi)存共享方法,以及如何使用該方法提高服務(wù)器的內(nèi)存密度,從而增加其托管其他應(yīng)用程序或 VMs 的能力。

其他技術(shù)支持

  • 存儲(chǔ)技術(shù)中的一個(gè)稱為去耦合(de-duplication)的最 新進(jìn)展是 Linux 和其他系統(tǒng)管理程序中的內(nèi)存共享的先驅(qū)。去耦合這種技術(shù)通過刪除冗余數(shù)據(jù)(基于數(shù)據(jù)塊,或者基于更大的數(shù)據(jù)片段,比如文件)來減少已存儲(chǔ)的數(shù)據(jù)。公共數(shù)據(jù) 片段被合并(以一種 copy-on-write [CoW] 方式),釋放空間供其他用途。使用這種方法,存儲(chǔ)成本更低,最終需要的存儲(chǔ)器也更少。鑒于當(dāng)前的數(shù)據(jù)增長(zhǎng)速度,這個(gè)功能顯得非常重要。

KSM 操作

  • KSM 作為內(nèi)核中的守護(hù)進(jìn)程(稱為ksmd)存在,它定期執(zhí)行頁(yè)面掃描,識(shí)別副本頁(yè)面并合并副本,釋放這些頁(yè)面以供它用。KSM 執(zhí)行上述操作的過程對(duì)用戶透明。例如,副本頁(yè)面被合并(然后被標(biāo)記為只讀),但是,如果這個(gè)頁(yè)面的其中一個(gè)用戶由于某種原因更改該頁(yè)面,該用戶將(以 Copy on Write 方式)收到自己的副本。可以在內(nèi)核源代碼 ./mm/ksm.c 中找到 KSM 內(nèi)核模塊的完整實(shí)現(xiàn)。

  • KSM 依賴高級(jí)應(yīng)用程序來提供指導(dǎo),根據(jù)該指導(dǎo)確定合并的候選內(nèi)存區(qū)域。盡管 KSM 可以只掃描系統(tǒng)中的匿名頁(yè)面,但這將浪費(fèi) CPU 和內(nèi)存資源(考慮到管理頁(yè)面合并進(jìn)程所需的空間)。因此,應(yīng)用程序可以注冊(cè)可能包含副本頁(yè)面的虛擬區(qū)域。

  • KSM 應(yīng)用程序編程接口(API)通過 madvise 系統(tǒng)調(diào)用(見清單 1)和一個(gè)新的建議參數(shù) MADV_MERGEABLE(表明已定義的區(qū)域可以合并)來實(shí)現(xiàn)??梢酝ㄟ^ MADV_UNMERGEABLE 參數(shù)(立即從一個(gè)區(qū)域取消合并任何已合并頁(yè)面)從可合并狀態(tài)刪除一個(gè)區(qū)域。注意,通過 madvise 來刪除一個(gè)頁(yè)面區(qū)域可能會(huì)導(dǎo)致一個(gè) EAGAIN 錯(cuò)誤,因?yàn)樵摬僮骺赡軙?huì)在取消合并過程中耗盡內(nèi)存,從而可能會(huì)導(dǎo)致更大的麻煩(內(nèi)存不足情況)。

  • 清單 1. madvise 系統(tǒng)調(diào)用

  • 一旦某個(gè)區(qū)域被定義為 “可合并”,KSM 將把該區(qū)域添加到它的工作內(nèi)存列表。啟用 KSM 時(shí),它將搜索相同的頁(yè)面,以寫保護(hù)的 CoW 方式保留一個(gè)頁(yè)面,釋放另一個(gè)頁(yè)面以供它用。

KSM

  • 使用的方法與內(nèi)存去耦合中使用的方法不同。在傳統(tǒng)的去耦合中,對(duì)象被散列化,然后使用散列值進(jìn)行初始相似性檢查。當(dāng)散列值一致時(shí),下一步是進(jìn)行一個(gè)實(shí)際對(duì) 象比較(本例中是一個(gè)內(nèi)存比較),以便正式確定這些對(duì)象是否一致。KSM 在它的第一個(gè)實(shí)現(xiàn)中采用這種方法,但后來開發(fā)了一種更直觀的方法來簡(jiǎn)化它。

  • 在當(dāng)前的 KSM 中,頁(yè)面通過兩個(gè) 紅黑樹 管理,其中一個(gè)紅黑樹是臨時(shí)的。第一個(gè)樹稱為不穩(wěn)定樹,用于存儲(chǔ)還不能理解為穩(wěn)定的新頁(yè)面。換句話說,作為合并候選對(duì)象的頁(yè)面(在一段時(shí)間內(nèi)沒有變化)存儲(chǔ)在這個(gè)不穩(wěn)定樹中。不穩(wěn)定樹中的頁(yè)面不是寫保護(hù)的。第二個(gè)樹稱為穩(wěn)定樹,存儲(chǔ)那些已經(jīng)發(fā)現(xiàn)是穩(wěn)定的且通過 KSM 合并的頁(yè)面。為確定一個(gè)頁(yè)面是否是穩(wěn)定頁(yè)面,KSM 使用了一個(gè)簡(jiǎn)單的 32位校驗(yàn)和(checksum)。當(dāng)一個(gè)頁(yè)面被掃描時(shí),它的校驗(yàn)和被計(jì)算且與該頁(yè)面存儲(chǔ)在一起。在一次后續(xù)掃描中,如果新計(jì)算的校驗(yàn)和不等于此前計(jì)算的校驗(yàn)和,則該頁(yè)面正在更改,因此不是一個(gè)合格的合并候選對(duì)象。

使用 KSM

  • 進(jìn)程處理一個(gè)單一的頁(yè)面時(shí),第一步是檢查是否能夠在穩(wěn)定樹中發(fā)現(xiàn)該頁(yè)面。搜索穩(wěn)定樹的過程很有趣,因?yàn)槊總€(gè)頁(yè)面都被視為一個(gè)非常大的數(shù)字(頁(yè)面的內(nèi)容)。

  • 一個(gè) memcmp(內(nèi)存比較)操作將在該頁(yè)面和相關(guān)節(jié)點(diǎn)的頁(yè)面上執(zhí)行。如果 memcmp 返回 0,則頁(yè)面相同,發(fā)現(xiàn)一個(gè)匹配值。反之,如果 memcmp 返回 -1,則表示候選頁(yè)面小于當(dāng)前節(jié)點(diǎn)的頁(yè)面;如果返回 1,則表示候選頁(yè)面大于當(dāng)前節(jié)點(diǎn)的頁(yè)面。盡管比較 4KB 的頁(yè)面似乎是相當(dāng)重量級(jí)的比較,但是在多數(shù)情況下,一旦發(fā)現(xiàn)一個(gè)差異,memcmp 將提前結(jié)束。請(qǐng)參見圖 3 查看這個(gè)過程的視覺呈現(xiàn)。


編輯切換為居中


  • 如果候選頁(yè)面位于穩(wěn)定樹中,則該頁(yè)面被合并,候選頁(yè)面被釋放。有關(guān)代碼位于 ksm.c/stable_tree_search()(稱為 ksm.c/cmp_and_merge_page())中。反之,如果沒有發(fā)現(xiàn)候選頁(yè)面,則應(yīng)轉(zhuǎn)到不穩(wěn)定樹(參見 ksm.c/unstable_tree_search())。

  • 在不穩(wěn)定樹中搜索時(shí),第一步是重新計(jì)算頁(yè)面上的校驗(yàn)和。如果該值與原始校驗(yàn)和不同,則本次掃描的后續(xù)搜索將拋棄這個(gè)頁(yè)面(因?yàn)樗牧耍恢档酶櫍?。如果校?yàn)和沒有更改,則會(huì)搜索不穩(wěn)定樹以尋找候選頁(yè)面。不穩(wěn)定樹的處理與穩(wěn)定樹的處理有一些不同。第一,如果搜索代碼沒有在不穩(wěn)定樹中發(fā)現(xiàn)頁(yè)面,則在不穩(wěn)定樹中為該頁(yè)面添加一個(gè)新節(jié)點(diǎn)。但是如果在不穩(wěn)定樹中發(fā)現(xiàn)了頁(yè)面,則合并該頁(yè)面,然后將該節(jié)點(diǎn)遷移到穩(wěn)定樹中。

  • 當(dāng)掃描完成(通過 ksm.c/ksm_do_scan() 執(zhí)行)時(shí),穩(wěn)定樹被保存下來,但不穩(wěn)定樹則被刪除并在下一次掃描時(shí)重新構(gòu)建。這個(gè)過程大大簡(jiǎn)化了工作,因?yàn)椴环€(wěn)定樹的組織方式可以根據(jù)頁(yè)面的變化而變化(還記得不穩(wěn)定樹中的頁(yè)面不是寫保護(hù)的嗎?)。由于穩(wěn)定樹中的所有頁(yè)面都是寫保護(hù)的,因此當(dāng)一個(gè)頁(yè)面試圖被寫入時(shí)將生成一個(gè)頁(yè)面故障,從而允許 CoW 進(jìn)程為寫入程序取消頁(yè)面合并(請(qǐng)參見 ksm.c/break_cow())。穩(wěn)定樹中的孤立頁(yè)面將在稍后被刪除(除非該頁(yè)面的兩個(gè)或更多用戶存在,表明該頁(yè)面還在被共享)。

  • 如前所述,KSM 使用 紅黑樹 來管理頁(yè)面,以支持快速查詢。實(shí)際上,Linux 包含了一些 紅黑樹 作為一個(gè)可重用的數(shù)據(jù)結(jié)構(gòu),可以廣泛使用它們。紅黑樹 還可以被 Completely Fair Scheduler (CFS) 使用,以便按時(shí)間順序存儲(chǔ)任務(wù)。您可以在 ./lib/rbtree.c 中找到 紅黑樹 的這個(gè)實(shí)現(xiàn)。

KSM 配置和監(jiān)控

  • KSM 的管理和監(jiān)控通過 sysfs(位于根 /sys/kernel/mm/ksm)執(zhí)行。在這個(gè) sysfs 子目錄中,您將發(fā)現(xiàn)一些文件,有些用于控制,其他的用于監(jiān)控。

  • 第一個(gè)文件 run 用于啟用和禁用 KSM 的頁(yè)面合并。默認(rèn)情況下,KSM 被禁用(0),但可以通過將一個(gè) 1 寫入這個(gè)文件來啟用 KSM 守護(hù)進(jìn)程(例如,echo 1 > sys/kernel/mm/ksm/run)。通過寫入一個(gè) 0,可以從運(yùn)行狀態(tài)禁用這個(gè)守護(hù)進(jìn)程(但是保留合并頁(yè)面的當(dāng)前集合)。另外,通過寫入一個(gè) 2,可以從運(yùn)行狀態(tài)(1)停止 KSM 并請(qǐng)求取消合并所有合并頁(yè)面。

  • KSM 運(yùn)行時(shí),可以通過 3 個(gè)參數(shù)(sysfs中的文件)來控制它。sleep_millisecs 文件定義執(zhí)行另一次頁(yè)面掃描前 ksmd 休眠的毫秒數(shù)。max_kernel_pages 文件定義 ksmd 可以使用的最大頁(yè)面數(shù)(默認(rèn)值是可用內(nèi)存的 25%,但可以寫入一個(gè) 0 來指定為無(wú)限)。最后,pages_to_scan 文件定義一次給定掃描中可以掃描的頁(yè)面數(shù)。任何用戶都可以查看這些文件,但是用戶必須擁有根權(quán)限才能修改它們。

  • 還有 5 個(gè)通過 sysfs 導(dǎo)出的可監(jiān)控文件(均為只讀),它們表明 ksmd 的運(yùn)行情況和效果。full_scans 文件表明已經(jīng)執(zhí)行的全區(qū)域掃描的次數(shù)。剩下的 4 個(gè)文件表明 KSM 的頁(yè)面級(jí)統(tǒng)計(jì)數(shù)據(jù):

  1. pages_shared:KSM 正在使用的不可交換的內(nèi)核頁(yè)面的數(shù)量。

  2. pages_sharing:一個(gè)內(nèi)存存儲(chǔ)指示。

  3. pages_unshared:為合并而重復(fù)檢查的惟一頁(yè)面的數(shù)量。

  4. pages_volatile:頻繁改變的頁(yè)面的數(shù)量。

  • KSM 作者定義:較高的 pages_sharing/pages_shared 比率表明高效的頁(yè)面共享(反之則表明資源浪費(fèi))。

結(jié)束語(yǔ)

  • Linux 并不是使用頁(yè)面共享來改進(jìn)內(nèi)存效率的惟一系統(tǒng)管理程序,但是它的獨(dú)特之處在于將其實(shí)現(xiàn)為一個(gè)操作系統(tǒng)特性。VMware 的 ESX 服務(wù)器系統(tǒng)管理程序?qū)⑦@個(gè)特性命名為 Transparent Page Sharing (TPS),而 XEN 將其稱為 Memory CoW。不管采用哪種名稱和實(shí)現(xiàn),這個(gè)特性都提供了更好的內(nèi)存利用率,從而允許操作系統(tǒng)(KVM 的系統(tǒng)管理程序)過量使用內(nèi)存,支持更多的應(yīng)用程序或 VM。您可以在最新的 2.6.32 Linux 內(nèi)核中發(fā)現(xiàn) KSM — 以及其他很多有趣的特性。


一篇搞懂KSM機(jī)制剖析 — Linux內(nèi)核中的內(nèi)存去耦合的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
葵青区| 太仆寺旗| 长寿区| 湾仔区| 威远县| 成都市| 岳阳县| 西华县| 宁波市| 嘉义县| 新和县| 澄城县| 湖南省| 祁门县| 武强县| 宜兰市| 哈尔滨市| 铜山县| 白朗县| 枝江市| 安达市| 黄大仙区| 绥棱县| 康平县| 油尖旺区| 长海县| 比如县| 明水县| 安溪县| 皮山县| 灵寿县| 乳山市| 襄樊市| 安宁市| 苏尼特左旗| 巧家县| 岳阳县| 昂仁县| 将乐县| 长顺县| 闻喜县|