最近在整理Openstack的一些設(shè)計(jì),發(fā)現(xiàn)網(wǎng)上找到的一些資料都比較零碎,而官方的設(shè)計(jì)文檔非常詳細(xì),但都是英文讀起來略吃力,干脆花點(diǎn)功夫做點(diǎn)翻譯好了。 ---------------------------------------------------分割線---------------------------------------------- VirtDriverGuestCPUMemoryPlacement 原文鏈接如下:https://wiki./wiki/VirtDriverGuestCPUMemoryPlacement 適用范圍 本文檔討論虛擬機(jī)的CPU與內(nèi)存布局與虛擬主機(jī)之間的關(guān)系。注意,本文檔展示的是最初的討論與研究結(jié)果,而關(guān)于后續(xù)更加詳細(xì)的設(shè)計(jì)細(xì)節(jié),可以參見以下幾方面: · NUMA placement[1] · vCPU topology[2] · CPU pinning [3] · Large pages [4] 術(shù)語 · vCPU – 虛擬CPU,分配給虛擬機(jī)的邏輯CPU。根據(jù)虛擬機(jī)拓?fù)涞牟煌?,一個(gè)虛擬機(jī)CPU可以是一個(gè)CPU封裝元件(socket)、一個(gè)CPU核(core)、或者一個(gè)CPU線程(thread)。 · pCPU – 物理CPU, 虛擬機(jī)主機(jī)所展示的邏輯CPU,根據(jù)主機(jī)拓?fù)涞牟煌?,一個(gè)物理可以是一個(gè)CPU封裝元件(socket)、一個(gè)CPU核(core)、或者一個(gè)CPU線程(thread)。 · NUMA – 非一致內(nèi)存訪問架構(gòu),內(nèi)存訪問時(shí)間取決于內(nèi)存頁面和處理器核心之間的位置。 · node – 一個(gè)包含CPU或者內(nèi)存(或者二者兼具)的NUMA系統(tǒng)單元 · cell – node的通名詞,供libvirt API使用 · socket – 包含在NUMA系統(tǒng)單元內(nèi)的單個(gè)獨(dú)立CPU封裝元件 · core – 一個(gè)CPU封裝元件中的一個(gè)處理單元 · thread – 超線程,一個(gè)CPU核中的一個(gè)超流水線 · KSM – Linux內(nèi)核內(nèi)存共享技術(shù)(Kernel Shared Memory) · THP – 透明巨型頁,為進(jìn)程提前分配巨型頁的一種Linux技術(shù) 背景 虛擬CPU拓?fù)?/span> 在Openstack中,每一種虛擬化驅(qū)動(dòng)在為虛擬機(jī)定義CPU拓?fù)鋾r(shí),都有各自的方法。Libvirt的驅(qū)動(dòng)將每一個(gè)虛擬CPU定義為一個(gè)沒有超線程(no hyper-threads)只含有一個(gè)處理單元(with 1 core)的獨(dú)立CPU封裝原件(socket),當(dāng)操作系統(tǒng)不能識(shí)別所有的虛擬CPU時(shí),將會(huì)面臨一些問題。 · 許可(Licensing) – 操作系統(tǒng)供應(yīng)商許可規(guī)則,可能會(huì)嚴(yán)格約束操作系統(tǒng)所支持的CPU封裝元件(sockets)的數(shù)目。此時(shí),為虛擬機(jī)分配的虛擬CPU,應(yīng)該偏向處理單元(core),而不是封裝單元(socket)。 · 性能(Performance) – 各種CPU拓?fù)涞男阅懿⒉灰恢隆@?,兩個(gè)主機(jī)線程運(yùn)行在同一個(gè)處理單元(core)上時(shí),其性能就會(huì)低于運(yùn)行在不同的處理單元(core)上。而當(dāng)一個(gè)處理單元(core)有多個(gè)超線程(thread)時(shí),操作系統(tǒng)調(diào)度器將決定線程的具體運(yùn)行位置。超線程性能的影響,意味著除非指定將虛擬機(jī)超線程與虛擬機(jī)主機(jī)的超線程一一綁定,否則無法為虛擬機(jī)指定超線程。如果不綁定虛擬機(jī)CPU(vCPU)與物理CPU(pCPU)的關(guān)系,則虛擬機(jī)應(yīng)當(dāng)始終不使用超線程(threads==1),而只是用CPU封裝元件(sockets)與CPU處理單元(core),而沒有必要項(xiàng)用戶暴露超線程的配置能力。如果用戶的虛擬機(jī)對(duì)負(fù)載比較敏感,那么用戶最多會(huì)希望他們的鏡像不運(yùn)行在兄弟超線程(同一個(gè)處理單元上的超線程)上。 許可的影響,意味著用戶在上傳鏡像到glance時(shí),需要指明一個(gè)運(yùn)行鏡像的最佳的CPU拓?fù)?,包含處理單?/span>(core)與封裝元件(socket)的分配。云平臺(tái)管理員也可以修改程序的默認(rèn)值,以避免用戶超出常見的許可限制。也就是說,對(duì)于一個(gè)4虛擬CPU核的虛擬機(jī),如果使用默認(rèn)值限制最大的封裝元件(socket)數(shù)目為2,則可以設(shè)置其處理單元為2,此時(shí)windows鏡像也能夠正常處理。 NUMA拓?fù)?/span> 虛擬主機(jī)NUMA 現(xiàn)在虛擬化主機(jī)都支持NUMA拓?fù)?,?huì)將內(nèi)存與物理CPU分布在2個(gè)或者更多的NUMA單元上。也有些CPU模型引入了兩級(jí)NUMA的架構(gòu),這些在本文檔中不做深入討論。 主要驅(qū)動(dòng)NUMA使用的因素是高存儲(chǔ)帶寬,有效的緩存效率以及靈活PCIe I/O設(shè)備的布局。也就是說,每一個(gè)NUMA單元內(nèi)部都由自己專有的內(nèi)存總線,用于訪問專用內(nèi)存,而所有NUMA單元使用共享總線訪問遠(yuǎn)端的內(nèi)存。假如有一個(gè)具有4個(gè)NUMA單元的系統(tǒng),每一個(gè)單元內(nèi)部有1GB/s的存儲(chǔ)帶寬,同時(shí)共享總線也具有1GB/s的帶寬。如果所有的處理器總是使用NUMA單元內(nèi)部內(nèi)存,那么系統(tǒng)就擁有了4 GB/s 的存儲(chǔ)帶寬潛力。如果所有處理器都是用遠(yuǎn)端存儲(chǔ),那么系統(tǒng)就只有了1 GB/s 的存儲(chǔ)帶寬潛力。使用共享的總線可能觸發(fā)NUMA單元之間的緩存異常同步,對(duì)于內(nèi)存密集型工作負(fù)載的性能會(huì)產(chǎn)生顯著影響。當(dāng)I / O性能至關(guān)重要時(shí),加上共享總線上的無效cache資源浪費(fèi),連接到遠(yuǎn)程PCIe總線上的設(shè)備(也就是說連接不同NUMA單元)作業(yè)性能將會(huì)急劇下降。 因此,虛擬機(jī)在NUMA單元上的錯(cuò)誤布局,或者不正確的PCI設(shè)備分配選擇,將會(huì)導(dǎo)虛擬化主機(jī)資源的嚴(yán)重浪費(fèi)。這點(diǎn)影響將會(huì)抹掉任何內(nèi)存與CPU決策所帶來的好處,包括虛擬CPU拓?fù)?,物?/span>CPU與虛擬CPU綁定,以及使用大頁內(nèi)存。因此標(biāo)準(zhǔn)的策略將是一個(gè)虛擬機(jī)完全局限在單個(gè)NUMA節(jié)點(diǎn)。 虛擬機(jī) NUMA 如果虛擬機(jī)的虛擬CPU或者內(nèi)存分配大過了NUMA單元,或者NUMA單元可用的PCIe設(shè)備不足時(shí),必須針對(duì)虛擬機(jī)做出合適的策略,或者禁止創(chuàng)建過大NUMA單元的虛擬機(jī),或者允許虛擬機(jī)跨越多NUMA運(yùn)行。在虛擬機(jī)遷移時(shí),可以更改這些策略,也就是說,在對(duì)主機(jī)進(jìn)行維護(hù)而疏散主機(jī)時(shí),會(huì)選擇接受臨時(shí)降低性能而選擇次優(yōu)的NUMA布局。布局的問題還要考慮到虛擬機(jī)的具體使用場(chǎng)景,例如,NFV的部署就要求嚴(yán)格的NUMA布局。 如果一個(gè)虛擬機(jī)多個(gè)NUMA單元,以是的操作系統(tǒng)能夠最大化利用其分配到的資源,主機(jī)的NUMA拓?fù)浔仨毐┞督o虛擬機(jī)。虛擬機(jī)的的NUMA單元應(yīng)該與虛擬化主機(jī)的NUMA單元進(jìn)行映射。這樣可以硬著大塊的虛擬機(jī)內(nèi)存到虛擬化主機(jī)內(nèi)存節(jié)點(diǎn),設(shè)置虛擬CPU與物理CPU的映射。也就是說,如果虛擬機(jī)有4個(gè)虛擬CPU需要跨越兩個(gè)虛擬化主機(jī)NUMA單元,虛擬CPU0/1綁定到第一個(gè)主機(jī)NUMA單元,而虛擬CPU2/3將會(huì)綁定到第二個(gè)主機(jī)NUMA單元上,但是并不強(qiáng)制綁定每一個(gè)以虛擬CPU與NUMA單元內(nèi)特定物理CPU的關(guān)系—這將由操作系統(tǒng)調(diào)度器指定。此時(shí),如果虛擬主機(jī)具有超線程特性,則暴露超線程特性給虛擬機(jī),同時(shí)在NUMA單元內(nèi)綁定虛擬CPU與物理CPU的關(guān)系。 虛擬機(jī)NUMA拓?fù)渑渲貌魂P(guān)注虛擬機(jī)操作系統(tǒng)。如果虛擬機(jī)操作系統(tǒng)不支持NUMA,If a guest OS does not support NUMA, then it would simply ignore the datatables exposed in the virtual BIOS. That said, the guest vCPU topology constraints will influence what particular NUMA topologies are viable to expose. ie if the guest only supports max 2 sockets, then there is little point in setting up 4 NUMA nodes with 1 socket 1 core in each. It would have to have 2 NUMA nodes with 1 socket, 2 cores in each. 大頁內(nèi)存 絕大多數(shù)現(xiàn)代CPU支持多種內(nèi)存頁尺寸,從4KB到2M/4M,最大可以達(dá)到1GB;所有處理器都默認(rèn)使用最小的4KB頁。如果大量的內(nèi)存可以使用大頁進(jìn)行分配,將會(huì)明顯減少CPU頁表項(xiàng),因此會(huì)增加頁表緩存的命中率,降低內(nèi)存訪問延遲。如果操作系統(tǒng)使用默認(rèn)的小頁內(nèi)存,隨著運(yùn)行時(shí)間,系統(tǒng)會(huì)出現(xiàn)越來越多的碎片,以至于很難申請(qǐng)到大頁的內(nèi)存。在大頁內(nèi)存大小越大時(shí),該問題越嚴(yán)重。因此,如果有使用大頁內(nèi)存的需求,最好的辦法是在系統(tǒng)啟動(dòng)時(shí)就預(yù)留好內(nèi)存空間。當(dāng)前的Linux內(nèi)核不允許針對(duì)特定的NUMA節(jié)點(diǎn)進(jìn)行這樣的設(shè)定,不過,在不久的將來這個(gè)限制將被取消。更進(jìn)一步的限制是,由于MMIO空洞的存在,內(nèi)存開始的1GB不能使用1GB的大頁。 Linux內(nèi)核已經(jīng)支持透明巨型頁(THP,transparent huge pages)特性。該特性會(huì)嘗試為應(yīng)用程序預(yù)分配大頁內(nèi)存。依賴該特性的一個(gè)問題是,虛擬機(jī)的擁有者,并不能保證給虛擬機(jī)使用的是大頁內(nèi)存還是小頁內(nèi)存。 內(nèi)存塊是直接指定給特定的NUMA單元的,這就意味著大頁內(nèi)存也是直接指定在NUMA單元上的。因此在NUMA單元上分配虛擬機(jī)時(shí),計(jì)算服務(wù)需要考慮在NUMA單元或者主機(jī)上可能會(huì)用到的大頁內(nèi)存。為虛擬機(jī)內(nèi)存啟用大頁內(nèi)存時(shí),可以不用考慮虛擬機(jī)操作系統(tǒng)是否會(huì)使用。 |
|