KVM性能優(yōu)化最佳實踐_第1頁
KVM性能優(yōu)化最佳實踐_第2頁
KVM性能優(yōu)化最佳實踐_第3頁
KVM性能優(yōu)化最佳實踐_第4頁
KVM性能優(yōu)化最佳實踐_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、 KVM性能優(yōu)化最佳實踐CPU優(yōu)化最佳實踐任何平臺根據(jù)場景的不同,都有相應的優(yōu)化。不一樣的硬件環(huán)境、網(wǎng)絡環(huán)境,同樣的一個平臺,它跑出的效果也肯定不一樣。就好比一輛法拉利,在高速公路里跑跟鄉(xiāng)村街道跑,速度和激情肯定不同.所以,我們做運維工作,也是如此。首先你得充分了解你所用的軟件平臺,然后根據(jù)你現(xiàn)有的生產(chǎn)環(huán)境去充分的測試,最后得出結(jié)果,做最優(yōu)的調(diào)整。KVM也是一樣,首先要做的是充分的了解它,看看有哪些參數(shù)和設置我們可以做出調(diào)整,最終應用以求發(fā)揮最高的性能。那么KVM的性能調(diào)優(yōu),我們可以從四個方面入手 CPU、內(nèi)存、磁盤IO、網(wǎng)絡。KVM CPU性能調(diào)優(yōu)CPU這塊我們是針對NUMA這塊的調(diào)優(yōu),那么

2、什么是NUMA呢?NUMA是英文Non Uniform Memory Access Architecture 的縮寫,意思就是非統(tǒng)一內(nèi)存訪問,它是一種解決多CPU共同工作的解決方案。我們知道現(xiàn)在的服務器配置都比較高了,CPU很多都是多路多核的,而且CPU是需要跟存儲器進行數(shù)據(jù)交互的,以往的年代,那時候的CPU運算速率不高,而且都是單CPU模式,那么存儲器里的數(shù)據(jù)要放到CPU里進行運算這是完完全全跟得上的。但是現(xiàn)在的CPU運算速度大大增強了,而且都是多CPU模式,于是就出現(xiàn)了不平衡,那就是存儲器里的數(shù)據(jù)完全不夠讓CPU消化,并且還會出現(xiàn)多個CPU搶食存儲器的情況. 這種情況下CPU就表現(xiàn)得非常的

3、饑渴. 數(shù)據(jù)不夠享用,而且存儲器還不夠分配。因此計算機科學家為了提升計算機的性能,就認真的研究了下CPU和存儲器之間的協(xié)調(diào)交互模式??傮w核心思想就是尋找一個多CPU模式下,如何讓CPU能最大化的“享用”更多來自多個存儲器的數(shù)據(jù)。于是就設計出了以下幾套解決方案:1.1 SMP技術最開始是SMP技術,SMP(Symmetric Multi-Processing )技術就是對稱多處理結(jié)構(gòu),這種結(jié)構(gòu)的最大特點就是CPU共享所有資源,比如總線,內(nèi)存,IO系統(tǒng)等等。既然是共享所有的資源,所以,各個CPU之間是平等的關系,然后操作系統(tǒng)管理著這些CPU對資源的訪問(通常是用隊列的形式去管理)。每個CPU依次的

4、去處理隊列中的進程,如果兩個CPU同時訪問,那么一般是通過軟件鎖的機制去解決爭奪的問題,軟件鎖這概念跟開發(fā)里的線程安全鎖機制道理是一樣的,當一個CPU處理著一進程,一般會先鎖住,處理完再釋放。所以說到這里,這里的對稱指的就是CPU之間是平等的無主從,訪問資源也是平等的。我們可以看下面這張圖:這個結(jié)構(gòu)是最早出現(xiàn)的方案,但是就是因為最早出現(xiàn),所以它的弊端很快就顯現(xiàn)出來了,那就是它的擴展能力不強。我們看上面這張圖就明顯感覺到,如果服務器要提升性能增加CPU,那么內(nèi)存(內(nèi)存最大化的情況下)就明顯不夠了,因為是共享模式,多一個CPU就多一個吃內(nèi)存數(shù)據(jù)的人. 因此多增加的CPU沒法享受到內(nèi)存的數(shù)據(jù),就會停

5、歇,這樣就造成了CPU的浪費。有實驗數(shù)據(jù)表明,SMP型的服務器CPU最好是2-4顆就OK了,多余的就浪費了。由此可見,這種方式是有缺陷的。因此科學家又想到了另外一個結(jié)構(gòu)方案,那就是NUMA。1.2 NUMA技術NUMA剛才我們在前面說了是非統(tǒng)一內(nèi)存訪問的意思,它的出現(xiàn)就很好的解決了SMP的擴展問題。有了NUMA技術那么就可以把幾十個甚至上百個CPU組合在一個服務器內(nèi)。NUMA架構(gòu)設計圖:從圖中我們發(fā)現(xiàn),每個CPU模塊之間都是通過互聯(lián)模塊進行連接和信息交互,CPU都是互通互聯(lián)的,同時,每個CPU模塊平均劃分為若干個Chip(不多于4個),每個Chip都有自己的內(nèi)存控制器及內(nèi)存插槽。在NUMA中還

6、有三個節(jié)點的概念:本地節(jié)點: 對于某個節(jié)點中的所有CPU,此節(jié)點稱為本地節(jié)點。鄰居節(jié)點:與本地節(jié)點相鄰的節(jié)點稱為鄰居節(jié)點。遠端節(jié)點:非本地節(jié)點或鄰居節(jié)點的節(jié)點,稱為遠端節(jié)點。鄰居節(jié)點和遠端節(jié)點,都稱作非本地節(jié)點(OffNode)。這里要注意的是,CPU訪問不同類型節(jié)點內(nèi)存的速度是不相同的,訪問本地節(jié)點的速度最快,訪問遠端節(jié)點的速度最慢,即訪問速度與節(jié)點的距離有關,距離越遠訪問速度越慢,此距離稱作NodeDistance。正是因為有這個特點,所以我們的應用程序要盡量的減少不通CPU模塊之間的交互,也就是說,如果你的應用程序能有方法固定在一個CPU模塊里,那么你的應用的性能將會有很大的提升。訪問速

7、度:本地節(jié)點鄰居節(jié)點遠端節(jié)點因此KVM也是一樣,我們在CPU優(yōu)化這塊就是要讓KVM綁定在指定的CPU上,這樣減少跨CPU的交互使用,讓KVM的性能提升?,F(xiàn)在我們的服務器還有l(wèi)inux操作系統(tǒng)都是默認走NUMA模式,所以我們接下來說說如何去做CPU的綁定。那么具體如何操作?1.3numactl命令講解我們這里用一臺真實的物理機演示,這臺物理機的是IBM 3650M4。首先我們用numactl命令查看NUMA的情況,如果你系統(tǒng)沒有這個命令,用 yum install numactl 安裝下即可。# numactl -h numactl 幫助命令,主要參數(shù)如下: -interleave=nodes,

8、 -i nodes 這個選項用于設定內(nèi)存的交織分配模式。 也就是說系統(tǒng)在為多個節(jié)點分配內(nèi)存空間的時候,將會以輪詢分發(fā)的方式被分配給這多個節(jié)點。如果在當前眾多的交織分配內(nèi)存節(jié)點中的目標節(jié)點無法正確的分配內(nèi)存空間的話,內(nèi)存空間將會由其他的節(jié)點來分配。多節(jié)點可以通過 -interleave , -membind 和 -cpunodebind 命令來指定。 -membind=nodes, -m nodes 選項 -membind 僅用來從節(jié)點中分配內(nèi)存空間所用。 如果在這些節(jié)點中無法分配出所請求的空間大小的話該分配操作將會失敗. 上述命令中指定需要分配空間的 nodes 的方式可以遵照上述 N,N,N

9、 , N-N ,N 這種方式來指定. -cpunodebind=nodes, -N nodes 這命令僅用于施加在運行與 cpu 上的進程。這個命令用于顯示 cpu 的個數(shù),cpu 數(shù)目信息同樣記錄在系統(tǒng)中的存放處理器領域信息的 /proc/cpuinfo 文件夾下,或者是按照關聯(lián)的中央處理器信息 在當前的中央處理器集中所存放。 -localalloc, -l 這個命令選項通常是為當前的節(jié)點分配內(nèi)存的。 -preferred=node 該命令由于指定優(yōu)先分配內(nèi)存空間的節(jié)點,如果無法將空間分配給該節(jié)點的話,應該分配給該節(jié)點上的空間將會被分發(fā)到其他的節(jié)點上 。 該命令選項后面僅接收一個單獨的節(jié)點標

10、號. 相關的表示方式也可以使用。 -show, -s 該命令用于顯示 NUMA 機制作用在當前運行的那些進程上。 -hardware, -H 該命令用于顯示當前系統(tǒng)中有多少個可用的節(jié)點。 -huge 當創(chuàng)建一個基于大內(nèi)存頁面的系統(tǒng)級的共享內(nèi)存段的時候使用-huge 這個選項,注意這選項僅在 -shmid 或是 -shm 命令的后面使用才有效。 -offset 該參數(shù)選項用于指定共享內(nèi)存段中的位移量的偏移。 默認的情況下偏移量是 0 。 有效的偏移量單位是 m (用于表示 MB) g (用于表示 GB) , k (用于表示 KB ), 其他沒有指定的被認為是以字節(jié)為單位。 -strict 這個參

11、數(shù)選項 當施加了 NUMA 調(diào)度機制的共享內(nèi)存段區(qū)域的頁面被施加了另一個機制而導致錯誤的時候,使用 -strict 選項將會把錯誤信息顯示出來. 默認情況是不使用該選項的。 -shmmode shmmode 該選項僅在 -shmid 或是 -shm 之前使用才會生效。 當創(chuàng)建一個共享內(nèi)存段的時候,通過整型數(shù)值來指定共享內(nèi)存的共享的模式類型。 -shmid id 通過ID 號碼來創(chuàng)建或使用一個共享內(nèi)存段。(如果共享內(nèi)存段已經(jīng)存在,那么通過 shmid 來指定下面要使用某個 ID 的共享內(nèi)存段;如果該 ID 對應的共享內(nèi)存段并不存在的話,那么就創(chuàng)建一個)。 -shm shmkeyfile 通過存放

12、在 shmkeyfile(共享內(nèi)存-鍵文件)中的 ID 號碼來創(chuàng)建或者是使用一個共享內(nèi)存段。訪問 shmkeyfile 文件的進程是通過 fork(3 arguments) 方法來實現(xiàn)的。 -file tmpfsfile 將 numa 機制施加于文件上面, 這個文件屬于 tmpfs或者是 hugetlbfs 這種特殊的文件系統(tǒng)。 -touch 通過將 numa 機制施加于剛剛頁面上來實現(xiàn)內(nèi)存的早期 numa 化。默認情況下是不使用該選項,如果存在映射或是訪問頁面的應用的話,將會使用該早期實行 NUMA 機制的這種方法。 -dump 該選項用于廢除將已經(jīng) numa 化的特定區(qū)域上的 NUMA性質(zhì)

13、. -dump-nodes nodes 所指定的節(jié)點以外的所有節(jié)點上的 NUMA 特性全都會被移除 all 用于將所有的節(jié)點上的 NUMA 特性移除 number 通過指定 node 后接的數(shù)值來廢除該數(shù)字對應的 node number1(number2) node number1(node number2)上的 NUMA 特性將會被移除 number1-number2 node number1 - node number2 區(qū)間上的所有存在的 node 的 NUMA 特性將會被移除 !nodes 除了 nodes 所指定的節(jié)點以外的所有節(jié)點上的 NUMA 特性全都會被移除OK,以上是numa

14、ctl的詳細命令,那么接下來我們先看看當前服務器CPU的numa情況:我們執(zhí)行l(wèi)scpu命令可以查看到一些CPU信息:我們用numactl -hardware可以查看,如這里我準備了兩臺IBM的服務器,一個3650M4另外一個是3850M2。我們可以從命令返回的情況看出,這臺服務器numa有2個node(node0和node1):我們再看另外一個服務器,這是一臺IBM 3850M2,那么它就只有一個node: 通過這個numactl -hardware命令,我們可以看出上面那臺機器每個node有81894 MB的內(nèi)存可以使用(大概79G),而IBM 3850M2這個服務器node有131070

15、MB(120多G)內(nèi)存可用(基本上是整個服務器的內(nèi)存)那么接下來我們可以看下cpu numa的調(diào)度分配情況:我們運行numastat命令可以查到: 3650M4 3850M2參數(shù)解釋:numa_hit使用本節(jié)點內(nèi)存次數(shù)num_miss計劃使用本節(jié)點內(nèi)存而被調(diào)度到其他節(jié)點次數(shù)num_foregin計劃使用其他節(jié)點內(nèi)存而使用本地內(nèi)存次數(shù)interleave_hit交叉分配使用的內(nèi)存中使用本節(jié)點的內(nèi)存次數(shù)local_node在本節(jié)點運行的程序使用本節(jié)點內(nèi)存次數(shù)NB other_node在其他節(jié)點運行的程序使用本節(jié)點內(nèi)存次數(shù) 接著我們看下這個命令:numastat-c , 這個命令c 后面跟上進程名就

16、能看到相關進程的NUMA內(nèi)存使用情況。比如:numastat -cqemu-kvm,這樣我們就知道了qemu-kvm這個進程,它在node0 和node1上使用的內(nèi)存大小,單位是MB:OK 通過這幾個命令我們可以查看一些numa的基本狀態(tài)和使用情況。那么針對CPU Numa技術,linux操作系統(tǒng)本身呢也有自身對這塊的設計。拿linux來說,它默認使用的就是NUMA自動平衡策略,也就是說,系統(tǒng)會自動的調(diào)配numa的內(nèi)存使用,以求一個平衡。當然,這個設置是可以用戶自己控制的,如果我們想關閉,直接運行 # echo0/proc/sys/kernel/numa_balancing 即可 # echo

17、1/proc/sys/kernel/numa_balancing 就是開啟1.4 CPU綁定操作說到這,既然我們的操作系統(tǒng)還有CPU特性都采用了NUMA架構(gòu),那么我們完全可以通過調(diào)整KVM對應的NUMA關系來達到KVM CPU這方面的優(yōu)化。這里,我們一般是通過CPU綁定的方法來做相關操作的。那么具體的操作是怎么樣的呢?那么接下來我們通過一個例子來演示。這里是一臺物理機,之前我們看過了,現(xiàn)在上面裝好了KVM,然后運行著幾個虛擬機,我們用 virsh list 命令可以查看到當前運行的虛擬機列表。比如我們要看這個Win7-ent虛擬機里vCPU對應物理CPU的情況,那么可以運行: # virshv

18、cpuinfoWin7-ent 可以查看 這個虛擬機是2個vCPU 雙核的,然后都是跑在了物理機的CPU8上,使用的時間是2964.6s。最后一個是CPU的親和性,這個yyyyy 表示的是使用的物理CPU內(nèi)部的邏輯核,一個y就代表其中一個CPU邏輯核。全部是y ,那么說明這臺物理機的24個CPU核,這個CPU都能調(diào)度使用。當然,我們可以進入vrish ,然后運行emulatorpinWin7-ent, 通過這個命令我們可以更詳細的得到這個虛擬機可以用哪幾個核:我們可以看到目前這個虛擬機0-23的CPU它都能調(diào)度使用那么以上就是查看虛擬機CPU NUMA調(diào)度的信息,如果我們要把虛擬機綁定到固定的

19、CPU上,我們就要做以下操作: #virsh emulatorpinWin7-ent18-23-live 通過這個命令,我們把這個win7的虛擬機vCPU綁定在了18-23這6個CPU之間的核上。我們用命令查看下emulatorpinWin7-ent我們也可以用virsh dumpxml Win7-ent 查看確認:這是讓虛擬機里的vCPU一起綁定的方法。那么有的人會疑問,一個虛擬機我有兩個vCPU, 比如這個win7 ,它就是雙核的,我想讓里面的vCPU1和vCPU2分別綁定在不同的物理CPU上可以嗎?怎么操作呢?這也是可以的,我們通過下面的方法可以進行相關的vCPU分別綁定 # virsh

20、vcpupinWin7-ent022 # virshvcpupinWin7-ent123 # virshdumpxmlWin7-ent # virshvcpuinfoWin7-ent OK,這里要注意的是,你把虛擬機用reboot重啟,這個綁定配置還是生效的,但是你shutdown的話,CPU綁定的效果會失效。我們要讓VM關機然后起來也生效,就必須把參數(shù)寫入到虛擬機的XML里,然后保存,這樣關機了也不會失效,這里要注意下 # virsh edit vm1 wq! 添加: OK,以上就是CPU綁定技術的操作。通過這樣的操作,我們可以在一臺多CPU的物理機上固定幾個CPU給虛擬機用。當然,至于為什

21、么可以這樣做,前面我們提到了關于NUMA的原理,如果固定了虛擬機的CPU,那么它就不會去找遠端節(jié)點了,另外就是有些場景下,一物理機多個CPU,如果前面幾個CPU負載很高,利用率大,后面幾個CPU利用率低,那么我們可以協(xié)調(diào)下,做CPU的綁定,平衡下CPU的負載。以上是CPU的綁定,接下來我們講講CPU的熱添加。1.5 CPU 熱添加首先我們先了解下什么叫熱添加,熱添加就是在虛擬機運行不關機的情況下,做CPU的添加操作。那么要注意的是,這個熱添加是在Redhat7.0以后才出現(xiàn)的,之前是沒有的。所以要享用這功能那必須要求KVM宿主機和虛擬機都得在7.0版本以后。那么具體怎么操作我們通過一個演示給大

22、家操作下。比如目前這個虛擬機,這是一個CentOS7.1的。我們先看下目前虛擬機的CPU的數(shù)值,我們可以進系統(tǒng)查看,cat/proc/cpuinfo|grepprocessor|uniq|wc-l,我們看到當前是2個CPU:然后我們解釋下這個最大CPU分配數(shù)是怎么個意思,它的意思就是給這個虛擬機最大預留的CPU個數(shù),這個設置很重要,如果你想給虛擬機熱添加,那么這個設置必須寫。比如我們這里寫的4,那么我們可以給虛擬機最大熱添加到4個CPU,而且4是上限。那么接下來說下,具體怎么熱添加。我們先在宿主機里先給這個虛擬機添加第三個CPU,原來是2個,現(xiàn)在再添加一個變成3個:setvcpusVM3_Ce

23、ntOS7.13-live然后我們到虛擬機里面把這個CPU激活 :echo1/sys/devices/system/cpu/cpu2/online我們再運行查看,發(fā)現(xiàn)已經(jīng)變成3個了。如果要減少,那么只能在虛擬機里減少剛才的CPU # echo0/sys/devices/system/cpu/cpu2/online但是在宿主機層面看這個虛擬機的vCPU數(shù)還是3個,也就是說不支持熱減少,我們運行vcpuinfoVM3_CentOS7.1命令發(fā)現(xiàn)還是3個:同理,Windows的添加也是如此,直接在宿主機里添加第三個CPU即可 # setvcpusVM4_Win20083-live然后虛擬機里不用操作

24、,它會自動刷新成3個CPU,我們也可以一個windows虛擬機做相關的演示,具體的可以由讀者自己操作了。到這為止, 以上就是KVM CPU方面的優(yōu)化??偨Y(jié)起來就兩點,一個是CPU綁定,還有一個就是熱添加。CPU綁定首先得了解NUMA技術,然后站在整個宿主機CPU資源的層面去調(diào)節(jié)。熱添加,當你某個虛擬機正在運行,然后突然業(yè)務壓力增大了,可以通過這方法達到0停機提升虛擬機CPU性能。內(nèi)存優(yōu)化最佳實踐云技術實踐 我們說完CPU方面的優(yōu)化,接著我們繼續(xù)第二塊內(nèi)容,也就是內(nèi)存方面的優(yōu)化。內(nèi)存方面有以下四個方向去著手:EPT 技術大頁和透明大頁KSM 技術內(nèi)存限制1. EPT技術EPT也就是擴展頁表,這是

25、intel開創(chuàng)的硬件輔助內(nèi)存虛擬化技術。我們知道內(nèi)存的使用,是一個邏輯地址跟物理地址轉(zhuǎn)換的過程。虛擬機內(nèi)部有邏輯地址轉(zhuǎn)成成物理地址的過程,然后再跳出來,虛擬機這塊內(nèi)存又跟宿主機存在邏輯到物理的轉(zhuǎn)換。有了EPT技術,那么能夠?qū)⑻摂M機的物理地址直接翻譯為宿主機的物理地址,從而把后面那個轉(zhuǎn)換過程去掉了,增加了效率。那么這項技術,現(xiàn)在的服務器都支持,只要在BIOS打開了intel 的VT設置,那么這個也一起打開了。所以這個基于硬件的優(yōu)化,目前不需要做額外的什么操作。2. 大頁和透明大頁我們先解釋什么叫大頁。所謂的大頁指的是內(nèi)存的大頁面。當然,有大頁面必然有對應的小頁面.我們知道內(nèi)存采用的是分頁機制,當

26、初這個機制提出的時候,計算機的內(nèi)存大小也就幾十M,所以當時內(nèi)存默認的頁面大小都是4KB,那么這個4KB 也就是所謂的小頁面。但是隨著計算機的硬件發(fā)展,現(xiàn)在的內(nèi)存基本上都是幾十G 甚至上百G了,雖然,如果還是4KB小頁的方式,那么必然會存在一些問題。那么會有哪些問題呢?操作系統(tǒng)如果還是小頁存在,那么將會產(chǎn)生較多的TLB Miss和缺頁中斷,從而大大影響性能。為什么小頁就存在較多的Miss和缺頁中斷呢?比如說系統(tǒng)里的一個應用程序需要2MB的內(nèi)容,如果操作系統(tǒng)還是以4KB小頁為單位,那么內(nèi)存里就要有512個頁面(512*4KB=2M),所以在TLB里就需要512個表項以及512個頁表項,因此操作系統(tǒng)

27、就要經(jīng)歷512次的TLB miss和512次的缺頁中斷才能將2MB的應用程序空間全部映射到物理內(nèi)存里。想想,2MB內(nèi)存的需要就要經(jīng)歷512次的操作,如果內(nèi)存需求大呢?必然操作數(shù)量會大大增加,從而間接的影響性能。如果把這個4KB變成2MB呢?那就很輕松了,一次TLB Miss和缺頁中斷操作就完成了,大大的增加了效率。所以,虛擬機可以通過分配巨型頁也就是剛才說的大頁來提高運行性能。那么具體怎么操作呢?也就是說如何把這個4KB的小頁變成2MB甚至1GB的大頁,然后把這個大頁賦給虛擬機使用?我們可以先通過命令 cat /proc/meminfo | grep HugePages查看當前系統(tǒng)有多少個大頁

28、:我們看到,當前數(shù)量是0。那么如何設置大頁的數(shù)量呢?也就是上面的HugePages_Total的數(shù)量。只要運行echo 2000 /proc/sys/vm/nr_hugepages 這個命令即可:已經(jīng)變成了2000了。當然這樣重啟會失效,我們運行這個命令讓它永久生效 :sysctl -w vm.nr_hugepages=2000運行了這個命令系統(tǒng)重啟的話,大頁的數(shù)量也將是保持2000,不會變。接下來,我們還得把大頁進行掛載,我們運行:# mount -t hugetlbfs hugetlbfs /dev/hugepages 這個hugetlbfs 是一種特殊文件系統(tǒng),那至于為什么采用這樣的文件

29、系統(tǒng)是因為這樣花費的代價小。那么通過這幾步操作,開啟-設置大頁數(shù)量-掛載, 那么宿主機這塊就沒什么問題了。如果我們KVM里面的某個虛擬機要使用宿主機的大頁,那么我們還得做如下操作:重啟下libvirtd服務虛擬機也開啟透明巨型頁關閉虛擬機編輯虛擬機XML設置虛擬機可以使用宿主機的巨型頁數(shù)量我們先看看,當前的大頁是沒進程用的,hugepages_free是2000:我們先把libvirtd服務重啟:systemctl restart libvirtd.service然后,我們看看虛擬機的透明大頁有沒有打開,一般默認系統(tǒng)是打開的,我們確認下我們看到是always狀態(tài),那么就是打開的,OK,我們進行

30、下一步。編輯虛擬機XML文件,讓它使用宿主機的大頁。我們先把虛擬機關閉,然后 virsh editvmname命令修改,添加下圖中紅色框框的內(nèi)容:修改后,保存,然后開啟虛擬機,注意這個虛擬機的內(nèi)存是2G的配置。最后我們在宿主機運行cat /proc/meminfo | grep -i HugePages查看下大頁的使用情況我們發(fā)現(xiàn)hugepages_free已經(jīng)變成了912個了,那么使用了2000-912=1088 個。Hugepagesize是2M,也就是每頁頁面的大小,使用了1088個頁面,那么2*1088=2176M 正好跟虛擬機內(nèi)存的大小2G差不多。如果想讓虛擬機釋放大頁,那么只要把這

31、個虛擬機關機或者刪除XML里剛才添加的配置。剛才的操作,我們只是針對一個虛擬機的,也就是說我們把大頁面賦給了一個虛擬機。如果我們要賦予多個虛擬機怎么辦?那么要讓大頁同時讓多個虛擬機享用,有以下兩步要做:給NUMA 各個node節(jié)點分配多個2MB或者1GB的大頁編輯虛擬機xml文件以使用node里分配好的大頁我們可以運行下面兩個命令就可以給宿主機各個NUMA Node分配大頁# echo 4 /sys/devices/system/node/node0/hugepages/hugepages-1048576kB/nr_hugepages# echo 1024 /sys/devices/syste

32、m/node/node1/hugepages/hugepages-2048kB/nr_hugepages這兩個命令的意思就是先給node0里分配4個1GB的大頁,然后再給node1分配1024個2MB的大頁。然后執(zhí)行相關掛載操作,這跟剛才我們做的操作類似:# mkdir /dev/hugepages1G# mount -t hugetlbfs -o pagesize=1G none /dev/hugepages1G# mkdir /dev/hugepages2M# mount -t hugetlbfs -o pagesize=2M none /dev/hugepages2M掛載成功后,重啟下l

33、ibvirtd服務,然后虛擬機就可以使用了,但是這里要注意的是,1GB的大頁,虛擬機是不能直接使用的,需要在XML里指定。那么怎么指定? 我們目前宿主機NUMA node1和node2里面分別有4個1GB的和1024個2MB的大頁。因此,只要跑在這兩node上的虛擬機都可以享用了。比如剛才我們那虛擬機,我們要讓它使用1GB的大頁,我們只需要在XML里這樣定義: 紅色的部分就是要添加的參數(shù),size是1,表示第一個使用的page;然后單位unit是G,nodeset=0-3,5 意思是虛擬機的NUMAnode0,node1,node2 ,node3和node5將使用1GB的大頁 ; 虛擬機的no

34、de4將用2MB的大頁。注意,這里的nodeset指的是虛擬機的節(jié)點,同時還要注意的是,如果宿主機大頁面不夠用了,你這樣配置了,虛擬機是會起不來的。以上就是給虛擬機分配大頁的方法。當然如果你想把宿主機的大頁關閉,只要執(zhí)行:# sysctl vm.nr_hugepages=0# umount hugetlbfs接下來我們講下透明大頁。從Centos6開始,linux系統(tǒng)自帶了一技術叫透明巨型頁(transparenthugepage),它允許所有的空余內(nèi)存被用作緩存以提高性能,而且這個設置是默認開啟的,我們不需要手動去操作。Centos下,我們用cat /sys/kernel/mm/transp

35、arent_hugepage/enabled可以查看我們看到這個中括號把這個always括起來了,說明這機器的透明巨型頁的功能是打開的。當有512個頁面可以整合的時候,就會合成一個2MB的大頁;如果是在括號把never括起來了,那么就是關閉狀態(tài);madvise的話就是避免改變內(nèi)存占用。當然,如果你想改變透明巨型頁的狀態(tài),比如說關閉它,那么運行下面的命令即可:# echo never /sys/kernel/mm/transparent_hugepage/enabled最后要注意的是透明巨型頁跟剛才我們說的hugetlbfs 文件掛載大頁是不沖突的,如果你沒做任何大頁的指定和掛載,那么KVM就會

36、使用透明大頁的方式。那么說到這,大家就會疑問,既然有透明大頁,我為何還要費勁的去做相關大頁的指定? 其實這兩種方式都差不多,區(qū)別就是一個是手動的一,個是自動的。如果你對你宿主機資源把握的更加精準,推薦的還是手動指定。3. KSM 技術KSM是什么呢?KSM(KernelSamePageMerging),也就是所謂的相同頁面內(nèi)存壓縮技術。KSM服務在linux系統(tǒng)里默認是開啟的,它的作用就是讓內(nèi)存利用的更加高效,我們知道內(nèi)存是分頁的,如果多個程序中用的內(nèi)存都是相同的頁面,那么KSM就會把相同的內(nèi)存合并,這樣就能騰出更多的空間。KSM在系統(tǒng)里有個守護進程,它的作用就是不斷的掃描宿主機的內(nèi)存情況,檢

37、測有相同的頁面就會合并,這或多或少會消耗CPU。下面有幾個命令設置大家要了解:首先是開關KSM服務:systemctl start|stop ksmdsystemctl start|stop ksmtuned systemctl enable|disable ksmdsystemctl enable|disable ksmtuned如果你的環(huán)境,內(nèi)存資源比較豐富,VM又不多,這個功能開不開啟都無所謂;如果不夠,又想跑多一點的虛擬機,那么可以打開這個功能。但是你一定要注意,這個是一種內(nèi)存超用的方案,如果一臺宿主機里大部分虛擬機內(nèi)存變化比較頻繁,那么要慎重開啟,因為KSM會頻繁的做內(nèi)存掃描,不停的

38、做內(nèi)存合并操作,這會大量的消耗CPU資源,如果內(nèi)存不夠還會用到swap,那么最終會嚴重影響虛擬機性能。當然,也有設置能讓虛擬機不受宿主機KSM的影響,具體操作如下:編輯虛擬機的XML文件,添加: 這樣,這個KSM就不會去合并這個虛擬機的內(nèi)存了??偟膩碚f,如果你的環(huán)境硬件配置比較高,同時又追求VM數(shù)量,把KSM打開是一個很不錯的選擇(但是一定要做好相關資源的實時監(jiān)控,特別是CPU)。在筆者維護過的項目中,遇到過只追求數(shù)量而不追求性能的場景,當時我們就開啟了KSM服務,服務器配置是雙路E5-2690v32.60GHz48core、512G內(nèi)存,當每臺計算節(jié)點到80個VM的時候(VM大部分配置為4c

39、8G,windows和linux各占50%)。用htop命令監(jiān)控查看CPU每個核基本上都是99%滿負載,此時,虛擬機體驗十分不好,后來降到60個左右,CPU負荷在60%-70%,這樣情況才有明顯好轉(zhuǎn)。所以,用不用KSM視你自己的生產(chǎn)環(huán)境和客戶需求具體而定,這配置還是得慎重。4. 內(nèi)存限制技術通過虛擬機內(nèi)存限制,可以讓虛擬機的內(nèi)存使用限制在一定范圍內(nèi)。那么這個操作有什么作用呢?比如你的一臺KVM宿主機,里面跑著多個業(yè)務的虛擬機,有的虛擬機業(yè)務比較大,吃得內(nèi)存多,有的業(yè)務比較低,用不了多少內(nèi)存,那么我們可以通過內(nèi)存限制技術來手動調(diào)節(jié)宿主機的內(nèi)存分配。當然這里要說明的是,使用這個必須對你虛擬化環(huán)境特

40、別清楚,比如宿主機平時的負載情況以及各個虛擬機的負載情況。那么具體如何操作呢?我們通過memtune命令或者通過改虛擬機的XML文件來設定內(nèi)存的限制。這個memtune命令有以下4個參數(shù)hard_limit:強制設置虛擬機最大使用內(nèi)存,單位為KBsoft_limit:可用最大內(nèi)存,單位為KBswap_hard_limit:虛擬機最多使用的內(nèi)存加上swap的大小,單位為KBmin_guarantee:強制設置虛擬機最低使用的內(nèi)存,單位為KB最后一個參數(shù)雖然OPTIONS里有列出,但是實測是發(fā)現(xiàn)CentOS7.0 以上系統(tǒng)不能支持,執(zhí)行的時候會報下面這樣的錯誤:centos6 雖然不會報這個錯,但是這命令貌似也不會有實際效果官方解釋這是一個bug,大家可以參考下面的鏈接:/show_bug.cgi?id=11224

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論