每天5分鐘復習OpenStack(七)內存虛擬化

    標題中的存儲虛擬化,涉及到兩個方面,分別是內存和磁盤的虛擬化技術。內存的虛擬化就不得不提EPT和VPID 技術.

    首先申明下本人其實不想寫一些純理論的東西,但是架不住面試經被問,為此特將一些特別復雜的技術底層都隱去,盡量將技術講的簡單,我個人信奉一句話'If you can't explain it simply, you don't understand it well enough.'

    內存虛擬化發展

    初心:想擁有一段從頭開始的地址段。

    • 在物理機中內存空間是一個從零開始的連續的物理內存空間,為了使虛擬機也擁有一個從零開始的連續的物理內存空間,KVM 引入了一層新的地址空間,即客戶機的物理地址空間。(該地址空間并不是真正硬件上地址空間)。這樣原先在物理機上一個單層架構變成現在三層架構。
    1. 客戶機虛擬地址(Guest Virtual Address,GVA )
    2. 客戶機物理地址(Guest Physical Address,GPA )
    3. 宿主機物理地址 (Host Physical Address,HPA )

    得到一個三節棍

    一次內存的訪問要經過兩次地址轉換 GVA -> GPA -> HPA ,其效率可想而知是不高的。為了解決上述問題,一種叫影子頁表(Shadow Page Tables)技術從軟件上實現了客戶機虛擬地址 -> 宿主機的物理地址的直接轉換。

    影子魔法

    • 影子頁面雖然解決了兩次地址轉換的問題,但是其為每一個客戶機都維護一個影子頁表,其內存開銷也比較大,而且其技術基于軟件來實現,維護和調試都比較復雜。

    • 為了解決影子頁表的問題,Intel的CPU提供了EPT技術(AMD提供的類似技術叫作NPT,即Nested Page Tables),直接在硬件上支持GVA→GPA→HPA的兩次地址轉換,從而降低內存虛擬化實現的復雜度,也進一步提升了內存虛擬化的性能.

    • VPID(Virtual Page Identifier)則是 EPT 技術中一個重要的標識符。它用于區分不同虛擬機之間的頁表,確保每個虛擬機都有獨立的頁表和內存空間。

    • VPID 在虛擬化環境中起到類似身份證的作用。每個虛擬機都被分配一個唯一的 VPID,用于標識該虛擬機的頁表。這樣,不同的虛擬機可以同時運行,并且每個虛擬機都有自己獨立的內存空間,互相之間不會干擾彼此。

    總結來說,EPT 是一種虛擬化技術,用于用硬件的方式來實現兩次地址轉換,改善虛擬機內存訪問效率,而 VPID 則是在 EPT 技術中使用的標識符,用于區分不同虛擬機的頁表內存空間。

    驗證

    1. CPU 標記中是否支持EPT 和VPID
    lscpu |grep -E "ept |vpid" 或
    cat /proc/cpuinfo |grep -E "ept |vpid"
    

    1. 模塊是否加載

    在默認情況下,如果硬件支持了EPT、VPID,則kvm_intel模塊加載時默認開啟EPT和VPID特性,這樣KVM會默認使用它們

    # cat /sys/module/kvm_intel/parameters/ept
    Y
    # cat /sys/module/kvm_intel/parameters/vpid
    Y
    

    如果發現自己的環境沒有開啟可以通過
    modprobe kvm_intel ept=1,vpid=1 來開啟

    擴展

    內存也是可以超配的(也稱為過載使用over-commit),只是我們一般不這樣做,但是有些測試環境可以采用一些技術來允許內存的超配使用。

    當計算機的內存不足時,宿主機操作系統可以采用一些技術來幫助解決這個問題。以下是三種常見的技術:

    1)內存交換(swapping):這是一種利用硬盤上的交換空間來暫時存儲不常用的內存數據的方法。當內存不足時,操作系統會將一部分數據從內存中移出,并存儲到硬盤上的交換空間中。這樣,操作系統可以騰出更多的內存供其他程序使用。當需要訪問被交換出去的數據時,它們將被再次加載回內存。

    概括:將內存中數據,擠掉不常用數據放在硬盤上來釋放內存空間。對應就是linux上Swap 分區。

    2)氣球(ballooning):這是一種在虛擬化環境中使用的技術。它通過在客戶機和宿主機之間協作來管理內存。當宿主機的內存資源緊張時,它會使用一個特殊的驅動程序,即virio_balloon驅動,在客戶機中釋放一些未使用的內存。這些被釋放的內存可以供其他需要的客戶機使用。

    概括:物理機內存不足時,膨脹客戶機內存氣球,擠壓出空閑內存供物理機使用,同理客戶機內存不足時,壓縮內存氣球,釋放出內存供客戶機使用。

    kvm虛擬機加上如下配置

    在客戶機里面進行驗證

    3)頁共享(page sharing):當多個進程在客戶機上運行時,它們可能會使用相同的內存頁,例如代碼或庫文件。為了節省內存空間,操作系統可以使用KSM(Kernel Samepage Merging)技術將這些相同的內存頁合并為一個,并讓多個進程共享該頁。這樣,操作系統可以減少內存的使用,提高資源利用率。
    缺點:利用 KSM 使內存超用。這會導致消耗一定的計算資源用于內存掃描,加重了 CPU 的消耗。內存超用,使得頻繁地使用 swap 交互,導致 VM 性能下降。

    概括:在有多個客戶機使用相同的操作系統時,其會存在大量相同的內存頁,將這些內存頁合并,進而來減少內存占用。但其頻繁的內存掃描,加重CPU的消耗,本質上是一種以CPU換內存的措施,生產中是建議關閉。

    • 禁止所有客戶虛擬機KSM 頁共享:
    echo 0 > /sys/kernel/mm/ksm/pages_shared
    echo 0 > /sys/kernel/mm/ksm/pages_sharing
    

    內存優化技術

    大頁內存:

    大頁內存是計算機系統中的一種內存管理機制,它將傳統的小塊內存(通常為4KB)組合成更大的內存塊(通常為2MB或1GB)。相比于小頁內存,大頁內存擁有更大的連續地址空間。

    大頁內存的主要作用是改善系統的性能。這是因為在傳統的小頁內存中,每個頁面都需要額外的內存開銷來存儲頁表信息。當系統處理大量的內存訪問請求時,這些額外的開銷會導致緩存不命中、TLB(Translation Lookaside Buffer)失效等問題,從而降低系統的性能。

    通過使用大頁內存,系統可以減少頁表的數量和大小,從而降低了內存管理的開銷。這樣一來,系統在處理內存訪問時可以更高效地利用緩存和TLB,提高數據訪問速度,減少對內存子系統的負載。特別是在需要大量連續內存的應用程序(如數據庫、虛擬化環境等)中,使用大頁內存可以顯著提升性能。

    總而言之,大頁內存通過將小塊內存組合成更大的內存塊,減少了內存管理的開銷,提高了系統的性能,尤其適用于對連續內存需求較大的應用場景。

    • 4.1 查看是否開啟了大頁內存。
    cat /sys/kernel/mm/transparent_hugepage/enabled
    
    • 4.2 如果沒有開啟則編輯開機啟動菜單,開啟大頁內存
    編輯 /etc/default/grub 
    #加上如下參數,這里是開啟了大頁內存,大小為1G的大頁內存,有2頁,則大頁內存的總容量=1G*2 
    transparent_hugepage=always hugepagesz=1G hugepages=2
    

    這里先簡單介紹下大頁內存的加載,之后我們在DPDK的章節將會詳細介紹大頁內存的使用。

    posted @ 2023-10-26 22:47  ALEX_li88  閱讀(254)  評論(0編輯  收藏  舉報
    正能量网站你懂我意思下载,欧美亚洲综合视频,97国产超碰,久在线中文欧美