欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Linux Kernel Shared Memory 剖析

系統(tǒng) 2208 0

看到這篇文章的時(shí)候,感覺只有兩個(gè)字:郁悶。還在Linux-2.6.29的時(shí)候,就看是看Linux kernel virtual machine,那時(shí)候就感覺多個(gè)VM肯定有很多的內(nèi)存是共享的,完全可以合并,沒想到Linux的發(fā)展是這么的快,linux-2.6.32就正式的支持了ksm機(jī)制,實(shí)現(xiàn)了共享內(nèi)存的合并,而且還是專門針對虛擬機(jī)的,真是讓我抓狂,都是可惡的項(xiàng)目,全是在浪費(fèi)時(shí)間。下面轉(zhuǎn)載ksm相關(guān)的一篇文章,學(xué)習(xí)之余做個(gè)記錄,已備畢業(yè)設(shè)計(jì)只需。

簡介: 作為一個(gè)系統(tǒng)管理程序(hypervisor),Linux? 有幾個(gè)創(chuàng)新,2.6.32 內(nèi)核中一個(gè)有趣的變化是 Kernel Shared Memory (KSM)。KSM 允許這個(gè)系統(tǒng)管理程序通過合并內(nèi)存頁面來增加并發(fā)虛擬機(jī)的數(shù)量。本文探索 KSM 背后的理念(比如存儲去耦合)、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ì)。

Linux Kernel Shared Memory 剖析

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

特性命名

本文描述的特性非常新;因此,其名稱經(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)勢(KSM 最初設(shè)計(jì)用于基于內(nèi)核的虛擬機(jī)),但它在非虛擬環(huán)境中仍然有用。事實(shí)上,KSM 甚至在嵌入式 Linux 系統(tǒng)中也有用處,表明了這種方法的靈活性。下面,我們將探索這種 Linux 內(nèi)存共享方法,以及如何使用該方法提高服務(wù)器的內(nèi)存密度,從而增加其托管其他應(yīng)用程序或 VMs 的能力。

其他技術(shù)支持

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

KSM 操作

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

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

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


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

            				
#include <sys/mman.h>

int 
            
              madvise
            
            ( void *start, size_t length, int advice );

          

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

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

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

使用 KSM 進(jìn)程處理一個(gè)單一的頁面時(shí),第一步是檢查是否能夠在穩(wěn)定樹中發(fā)現(xiàn)該頁面。搜索穩(wěn)定樹的過程很有趣,因?yàn)槊總€(gè)頁面都被視為一個(gè)非常大的數(shù)字(頁面的內(nèi)容)。一個(gè) memcmp (內(nèi)存比較)操作將在該頁面和相關(guān)節(jié)點(diǎn)的頁面上執(zhí)行。如果 memcmp 返回 0,則頁面相同,發(fā)現(xiàn)一個(gè)匹配值。反之,如果 memcmp 返回 -1 ,則表示候選頁面小于當(dāng)前節(jié)點(diǎn)的頁面;如果返回 1 ,則表示候選頁面大于當(dāng)前節(jié)點(diǎn)的頁面。盡管比較 4KB 的頁面似乎是相當(dāng)重量級的比較,但是在多數(shù)情況下,一旦發(fā)現(xiàn)一個(gè)差異, memcmp 將提前結(jié)束。請參見圖 3 查看這個(gè)過程的視覺呈現(xiàn)。


圖 3. 搜索樹中的頁面的搜索過程

Linux Kernel Shared Memory 剖析

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

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

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

如前所述,KSM 使用 “紅-黑” 樹來管理頁面,以支持快速查詢。實(shí)際上,Linux 包含了一些 “紅-黑” 樹作為一個(gè)可重用的數(shù)據(jù)結(jié)構(gòu),可以廣泛使用它們。“紅-黑” 樹還可以被 Completely Fair Scheduler (CFS) 使用,以便按時(shí)間順序存儲任務(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 的頁面合并。默認(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)程(但是保留合并頁面的當(dāng)前集合)。另外,通過寫入一個(gè) 2 ,可以從運(yùn)行狀態(tài)( 1 )停止 KSM 并請求取消合并所有合并頁面。

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

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

  • pages_shared:KSM 正在使用的不可交換的內(nèi)核頁面的數(shù)量。
  • pages_sharing:一個(gè)內(nèi)存存儲指示。
  • pages_unshared:為合并而重復(fù)檢查的惟一頁面的數(shù)量。
  • pages_volatile:頻繁改變的頁面的數(shù)量。

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

結(jié)束語

Linux 并不是使用頁面共享來改進(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 — 以及其他很多有趣的特性。

Linux Kernel Shared Memory 剖析


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲一区二区在线视频 | 中文字幕亚洲欧美日韩在线不卡 | 欧美zzzz| 中文字幕亚洲综合 | 国产精品成人在线 | 小明天天看 | 久久久久高清 | 欧美黄视频网站 | 欧美一区二区三区久久久 | 国产精品69久久久久水密桃 | 91精品国产露脸在线观看 | 在线一区免费视频播放 | 狙击兵2通古电影高清 | 亚洲伊人精品 | 欧美日一区二区三区 | 国产欧美一区二区三区另类精品 | 亚洲精品久久久一区二区三区 | 日本理伦片午夜理伦片 | 一级毛片免费播放视频 | 91精品久久久久久久久久 | 污污的网站在线观看 | 激情五月综合 | 99精品99| www.youjizz.com久久| 国产在线视频91 | 无码日韩精品一区二区免费 | 美女羞羞视频网站 | 人妖一区 | 欧美日韩在线免费观看 | 中文字幕av亚洲精品一部二部 | 欧美视频网址 | 精品欧美一区二区精品久久久 | 18性夜影院午夜寂寞影院免费 | 91久久夜色精品国产九色 | 黄色片视频观看 | 午夜视频十八嗯嗯啊免费 | 国产成人在线视频播放 | 宅男lu666噜噜噜在线观看 | 色中色资源 | 免费看那种视频 | 欧美一区 |