《2017版:KVM性能優化之CPU優化》要點:
本文介紹了2017版:KVM性能優化之CPU優化,希望對您有用。如果有疑問,可以聯系我們。
任何平臺根據場景的不同,都有相應的優化.不一樣的硬件環境、網絡環境,同樣的一個平臺,它跑出的效果也肯定不一樣.就好比一輛法拉利,在高速公路里跑跟鄉村街道跑,速度和激情肯定不同…
所以,我們做運維工作,也是如此.首先你得充分了解你所用的軟件平臺,然后根據你現有的生產環境去充分的測試,最后得出結果,做最優的調整.
KVM也是一樣,首先要做的是充分的了解它,看看有哪些參數和設置我們可以做出調整,最終應用以求發揮最高的性能.
那么KVM的性能調優,我們可以從四個方面入手 —— CPU、內存、磁盤IO、網絡.
CPU這塊我們是針對NUMA這塊的調優,那么什么是NUMA呢?NUMA是英文?Non Uniform Memory Access Architecture 的縮寫,意思就是非統一內存訪問,它是一種解決多CPU共同工作的解決方案.我們知道現在的服務器配置都比較高了,CPU很多都是多路多核的,而且CPU是需要跟存儲器進行數據交互的,以往的年代,那時候的CPU運算速率不高,而且都是單CPU模式,那么存儲器里的數據要放到CPU里進行運算這是完完全全跟得上的.但是現在的CPU運算速度大大增強了,而且都是多CPU模式,于是就出現了不平衡,那就是存儲器里的數據完全不夠讓CPU消化,并且還會出現多個CPU搶食存儲器的情況… 這種情況下CPU就表現得非常的饑渴… 數據不夠享用,而且存儲器還不夠分配.
因此計算機科學家為了提升計算機的性能,就認真的研究了下CPU和存儲器之間的協調交互模式.總體核心思想就是尋找一個多CPU模式下,如何讓CPU能最大化的“享用”更多來自多個存儲器的數據.
于是就設計出了以下幾套解決方案:
最開始是SMP技術,SMP(Symmetric Multi-Processing )技術就是對稱多處理結構,這種結構的最大特點就是CPU共享所有資源,比如總線,內存,IO系統等等.
既然是共享所有的資源,所以,各個CPU之間是平等的關系,然后操作系統管理著這些CPU對資源的訪問(通常是用隊列的形式去管理).每個CPU依次的去處理隊列中的進程,如果兩個CPU同時訪問,那么一般是通過軟件鎖的機制去解決爭奪的問題,軟件鎖這概念跟開發里的線程安全鎖機制道理是一樣的,當一個CPU處理著一進程,一般會先鎖住,處理完再釋放.
所以說到這里,這里的對稱指的就是CPU之間是平等的無主從,訪問資源也是平等的.我們可以看下面這張圖:
這個結構是最早出現的方案,但是就是因為最早出現,所以它的弊端很快就顯現出來了,那就是它的擴展能力不強.我們看上面這張圖就明顯感覺到,如果服務器要提升性能增加CPU,那么內存(內存最大化的情況下)就明顯不夠了,因為是共享模式,多一個CPU就多一個吃內存數據的人… ?因此多增加的CPU沒法享受到內存的數據,就會停歇,這樣就造成了CPU的浪費.
有實驗數據表明,SMP型的服務器CPU最好是2-4顆就OK了,多余的就浪費了.
由此可見,這種方式是有缺陷的...因此科學家又想到了另外一個結構方案,那就是NUMA.
NUMA剛才我們在前面說了是非統一內存訪問的意思,它的出現就很好的解決了SMP的擴展問題.有了NUMA技術那么就可以把幾十個甚至上百個CPU組合在一個服務器內.
NUMA架構設計圖:
從圖中我們發現,每個CPU模塊之間都是通過互聯模塊進行連接和信息交互,CPU都是互通互聯的,同時,每個CPU模塊平均劃分為若干個Chip(不多于4個),每個Chip都有自己的內存控制器及內存插槽.
在NUMA中還有三個節點的概念:
鄰居節點和遠端節點,都稱作非本地節點(Off?Node).
這里要注意的是,CPU訪問不同類型節點內存的速度是不相同的,訪問本地節點的速度最快,訪問遠端節點的速度最慢,即訪問速度與節點的距離有關,距離越遠訪問速度越慢,此距離稱作Node?Distance.正是因為有這個特點,所以我們的應用程序要盡量的減少不通CPU模塊之間的交互,也就是說,如果你的應用程序能有方法固定在一個CPU模塊里,那么你的應用的性能將會有很大的提升.
訪問速度:本地節點>鄰居節點>遠端節點
因此KVM也是一樣,我們在CPU優化這塊就是要讓KVM綁定在指定的CPU上,這樣減少跨CPU的交互使用,讓KVM的性能提升.現在我們的服務器還有linux操作系統都是默認走NUMA模式,所以我們接下來說說如何去做CPU的綁定.
那么具體如何操作?
我們這里用一臺真實的物理機演示,這臺物理機的是IBM 3650M4.
首先我們用numactl命令查看NUMA的情況,如果你系統沒有這個命令,用 yum install numactl 安裝下即可.
OK,以上是numactl的詳細命令,那么接下來我們先看看當前服務器CPU的numa情況:
我們執行lscpu命令可以查看到一些CPU信息:
我們用numactl –hardware可以查看,如這里我準備了兩臺IBM的服務器,一個3650M4另外一個是3850M2.
我們可以從命令返回的情況看出,這臺服務器numa有2個node(node0和node1):
我們再看另外一個服務器,這是一臺IBM 3850M2,那么它就只有一個node:
通過這個numactl –hardware命令,我們可以看出上面那臺機器每個node有81894 MB的內存可以使用(大概79G),而IBM 3850M2這個服務器node有131070MB(120多G)內存可用(基本上是整個服務器的內存)
那么接下來我們可以看下cpu numa的調度分配情況:
我們運行numastat命令可以查到:
3650M4
3850M2
參數解釋:
接著我們看下這個命令:numastat?-c ?, 這個命令c 后面跟上進程名就能看到相關進程的NUMA內存使用情況.比如:numastat -c?qemu-kvm,這樣我們就知道了qemu-kvm這個進程,它在node0 和node1上使用的內存大小,單位是MB:
OK 通過這幾個命令我們可以查看一些numa的基本狀態和使用情況.那么針對CPU Numa技術,linux操作系統本身呢也有自身對這塊的設計.拿linux來說,它默認使用的就是NUMA自動平衡策略,也就是說,系統會自動的調配numa的內存使用,以求一個平衡.
當然,這個設置是可以用戶自己控制的,如果我們想關閉,直接運行
# echo?0?>?/proc/sys/kernel/numa_balancing ? ?即可
# echo?1?>?/proc/sys/kernel/numa_balancing ? ?就是開啟
說到這,既然我們的操作系統還有CPU特性都采用了NUMA架構,那么我們完全可以通過調整KVM對應的NUMA關系來達到KVM CPU這方面的優化.這里,我們一般是通過CPU綁定的方法來做相關操作的.
那么具體的操作是怎么樣的呢?那么接下來我們通過一個例子來演示.這里是一臺物理機,之前我們看過了,現在上面裝好了KVM,然后運行著幾個虛擬機,我們用 virsh list 命令可以查看到當前運行的虛擬機列表.
比如我們要看這個Win7-ent虛擬機里vCPU對應物理CPU的情況,那么可以運行:?# virsh?vcpuinfo?Win7-ent ?可以查看
這個虛擬機是2個vCPU 雙核的,然后都是跑在了物理機的CPU8上,使用的時間是2964.6s.最后一個是CPU的親和性,這個yyyyy 表示的是使用的物理CPU內部的邏輯核,一個y就代表其中一個CPU邏輯核.全部是y ,那么說明這臺物理機的24個CPU核,這個CPU都能調度使用.
當然,我們可以進入vrish ,然后運行emulatorpin?Win7-ent, 通過這個命令我們可以更詳細的得到這個虛擬機可以用哪幾個核:
我們可以看到目前這個虛擬機0-23的CPU它都能調度使用
那么以上就是查看虛擬機CPU NUMA調度的信息,如果我們要把虛擬機綁定到固定的CPU上,我們就要做以下操作: #?virsh emulatorpin?Win7-ent?18-23?–live ??通過這個命令,我們把這個win7的虛擬機vCPU綁定在了18-23這6個CPU之間的核上.
我們用命令查看下?emulatorpin?Win7-ent
我們也可以用virsh dumpxml Win7-ent 查看確認:
這是讓虛擬機里的vCPU一起綁定的方法.
那么有的人會疑問,一個虛擬機我有兩個vCPU, 比如這個win7 ,它就是雙核的,我想讓里面的vCPU1和vCPU2分別綁定在不同的物理CPU上可以嗎?怎么操作呢?這也是可以的,我們通過下面的方法可以進行相關的vCPU分別綁定
# virsh?vcpupin?Win7-ent?0?22
# virsh?vcpupin?Win7-ent?1?23
# virsh?dumpxml?Win7-ent
# virsh?vcpuinfo?Win7-ent
OK,這里要注意的是,你把虛擬機用reboot重啟,這個綁定配置還是生效的,但是你shutdown的話,CPU綁定的效果會失效.我們要讓VM關機然后起來也生效,就必須把參數寫入到虛擬機的XML里,然后保存,這樣關機了也不會失效,這里要注意下
OK,以上就是CPU綁定技術的操作.通過這樣的操作,我們可以在一臺多CPU的物理機上固定幾個CPU給虛擬機用.當然,至于為什么可以這樣做,前面我們提到了關于NUMA的原理,如果固定了虛擬機的CPU,那么它就不會去找遠端節點了,另外就是有些場景下,一物理機多個CPU,如果前面幾個CPU負載很高,利用率大,后面幾個CPU利用率低,那么我們可以協調下,做CPU的綁定,平衡下CPU的負載.
以上是CPU的綁定,接下來我們講講CPU的熱添加.
首先我們先了解下什么叫熱添加,熱添加就是在虛擬機運行不關機的情況下,做CPU的添加操作.那么要注意的是,這個熱添加是在Redhat7.0以后才出現的,之前是沒有的.所以要享用這功能那必須要求KVM宿主機和虛擬機都得在7.0版本以后.那么具體怎么操作我們通過一個演示給大家操作下.
比如目前這個虛擬機,這是一個CentOS7.1的.我們先看下目前虛擬機的CPU的數值,我們可以進系統查看,cat?/proc/cpuinfo|?grep?“processor”|?uniq|?wc?-l?,我們看到當前是2個CPU:
然后我們解釋下這個最大CPU分配數是怎么個意思,它的意思就是給這個虛擬機最大預留的CPU個數,這個設置很重要,如果你想給虛擬機熱添加,那么這個設置必須寫.比如我們這里寫的4,那么我們可以給虛擬機最大熱添加到4個CPU,而且4是上限.
那么接下來說下,具體怎么熱添加.我們先在宿主機里先給這個虛擬機添加第三個CPU,原來是2個,現在再添加一個變成3個:?setvcpus?VM3_CentOS7.1?3?–live
然后我們到虛擬機里面把這個CPU激活 :
echo?1?>/sys/devices/system/cpu/cpu2/online
我們再運行查看,發現已經變成3個了.
如果要減少,那么只能在虛擬機里減少剛才的CPU
# echo?0?>/sys/devices/system/cpu/cpu2/online
但是在宿主機層面看這個虛擬機的vCPU數還是3個,也就是說不支持熱減少,我們運行vcpuinfo?VM3_CentOS7.1命令發現還是3個:
同理,Windows的添加也是如此,直接在宿主機里添加第三個CPU即可
# setvcpus?VM4_Win2008?3?–live
然后虛擬機里不用操作,它會自動刷新成3個CPU,我們也可以一個windows虛擬機做相關的演示,具體的可以由讀者自己操作了.
到這為止, 以上就是KVM CPU方面的優化.總結起來就兩點,一個是CPU綁定,還有一個就是熱添加.
CPU綁定首先得了解NUMA技術,然后站在整個宿主機CPU資源的層面去調節.
熱添加,當你某個虛擬機正在運行,然后突然業務壓力增大了,可以通過這方法達到0停機提升虛擬機CPU性能.
參考鏈接:
http://www.cnblogs.com/yubo/archive/2010/04/23/1718810.html
http://cenalulu.github.io/linux/numa/
文章來自微信公眾號:云技術實踐
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4224.html