再論KVM超量使用

轉載自:http://www.sohu.com/a/111248295_251444

KVM超量使用一直是熱門話題,前段時間發的文章:

羣討論:虛擬機能否使用32個CPU

又引去了羣友的激烈討論,本文爲羣友根據自己的經驗總結投稿,感謝這位熱心的羣友!

歡迎更多的朋友投稿,將自己的經驗發給大家,我們一起進步。

KVM hypervisor支持超量使用CPUs和超量使用內存,超量使用意思是分配多於系統上物理資源的虛擬CPUs和內存。當CPU超量使用,利用率較低的虛擬服務器或桌面可以運行在更少的服務器上,從而節省系統資源的數量,從而節省電力、散熱在服務器硬件上的投資。

超量使用內存

大多數操作系統和應用程序不會總是使用有效RAM的100%,這個行爲可以被KVM利用。KVM可以分配更多於主機有效物理的內存給來賓。超量使用需要足夠的swap空間給所有來賓和所有主機的進程。

在KVM下,虛擬機當作是Linux的進程。在KVM hypervisor上的來賓沒有專門的物理RAM塊分配給它們,而來賓作爲Linux進程活動。Linux內核當進程請求更多的內存時分配給每個進程內存。KVM的來賓當來賓操作系統請求時被分配內存。

警告:確保總的swap和內存空間大於或等於所有運行中來賓的內存配置。如果少於這個總數會導致一個來賓被強制關機。

爲超量使用內存配置swap

swap分區用來交換未充分利用的內存到硬盤來提高內存性能。默認的swap分區大小是從主機的物理RAM計算而來的。

swap分區必須足夠大來提供所有來賓的虛擬內存和主機系統。

重要:下面的例子只是提供一個配置swap的指導。列出的設置可能在你的環境裏是不合適的。

Example 內存超量使用例子

ExampleServer1有32GB的RAM。系統要配置來運行56臺有1GB虛擬內存的來賓。主機系統爲系統進程,驅動和存儲緩存很少使用超過4GB內存。

32GB減去主機4GB剩下28GB物理RAM給來賓。每個來賓使用1GB的RAM,所有來賓總共需要56GB的虛擬RAM。

Red Hat官方知識庫建議一個32GB RAM的系統需要8GB的swap。爲了安全超量使用內存,需要有足夠的給所有來賓作虛擬內存以及主機。主機剩下28GB的RAM給所有來賓(來賓需要56GB的RAM)。因此,系統需要至少28GB的swap給所有來賓。

ExampleServer1需要至少36GB(8GB給主機以及28GB給來賓)的swap來安全超量使用來支持56臺來賓。

超量使用內存10倍於系統的物理RAM是有可能。這隻適用於某些類型的來賓,例如,小密集使用的桌面虛擬化或幾個有KSM的相同運行中的來賓。配置swap和內存超量使用不是一個標準,每一個環境和安裝是不一樣的。你的環境必須測試和自定義來確保穩定性和性能。

超量使用虛擬CPUs

KVM允許客戶機過載使用(over-commit)物理資源,即給客戶機分配的CPU和內存數量多於物理上實際存在的資源。

物理資源的過載使用能帶來一些資源充分利用方面的好處。試想在一臺強大的硬件服務器中運行着Web服務器、圖片存儲服務器、後臺數據統計服務器等作爲虛擬客戶機,但是它們並非在同一時刻都會負載很高,如Web服務器和圖片服務器在白天工作時間負載較重,而後臺數據統計服務器則主要在晚上工作,所以如果對物理資源進行合理的過載使用,給這幾個客戶機分配的系統資源總數多餘實際擁有的物理資源,就可能在白天和夜晚都充分利用物理硬件資源,而且由於幾個客戶機不會同時對物理資源造成很大的壓力,它們各自的服務質量(QoS)也是能得到保障的。

CPU的過載使用,是讓一個或多個客戶機使用vCPU的總數量超過實際擁有的物理CPU數量,QEMU會啓動更多的線程來爲客戶機提供服務,這些線程也是被Linux內核調度運行在物理CPU硬件上。

關於CPU的過載使用,最推薦的做法是對多個單CPU的客戶機使用over-commit,比如:在擁有4個邏輯CPU的宿主機中,同時運行多於4個(如8個、16個)客戶機,其中每個客戶機都被分配一個vCPU。這時,如果每個宿主機的負載不很大的情況下,宿主機Linux對每個客戶機的調度是非常有效的,這樣的過載使用並不會帶來客戶機中的性能損失。

關於CPU的過載使用,最不推薦的做法是讓某一個客戶機的vCPU數量超過物理系統上存在CPU數量。比如,在擁有4個邏輯CPU的宿主機中,同時運行一個或多個客戶機,其中每個客戶機的vCPU數量多於4個(如16個)。這樣的使用方法會帶來比較明顯的性能下降,其性能反而不如將客戶機分配2個(或4個)vCPU,而且如果客戶機中負載過重時,可能會讓整個系統運行不穩定。不過,在並非100%滿負載的情況下,一個(或多個)有4個vCPU的客戶機運行在擁有4個邏輯CPU的宿主機中並不會帶來明顯的性能損失。

總的來說,KVM允許CPU的過載使用,但是並不推薦在實際的生產環境(特別是負載較重的環境)中過載使用CPU。在生產環境中過載使用CPU,有必要在部署前進行嚴格的性能和穩定性測試。

KSM

共享內存的概念在當今操作系統中是常見的。例如,當一個程序首次啓動,它共享父進程所有的內存。當子進程或父進程嘗試去更改這個內存,內核分配一個塊新內存區域,拷貝原始內容並且允許這個程序去修改這塊新區域。這被認爲是寫時拷貝。

KSM是一個新的Linux特性使用相反的概念。KSM使內核去檢查2個或多個已經運行的程序並且比較它們的內存。如果任何內存區域或頁面是相同的,KSM減少多個相同的內存頁面到一個單獨的頁面。這個頁面然後被標記爲寫時拷貝。如果來賓更改了這個頁面的內容,一個新的頁面被創建給那個來賓。

這對KVM虛擬化是非常有用的。當一個來賓啓動,它只從父qemu-kvm進程繼承內存。當所有來賓運行相同的操作系統或應用程序時,那麼來賓運行來賓操作系統鏡像的內容可以被共享。KSM只識別和合並相同的頁面不會干擾來賓或對主機或來賓的安全性造成影響。KSM允許KVM請求這些被共享的相同的來賓內存區域。

KVM提供增強內存速率和利用率,在KSM下,共同的進程數據被存儲在緩存或主要內存中。這爲KVM來賓減少緩存遺漏可以提高一些應用程序和操作系統的性能。其次,共享內存減少來賓的整體內存使用率,允許更高密度和更大的資源利用率。

Red Hat EnterpriseLinux使用2個單獨的方法控制KSM:

·ksm服務啓用和停止KSM內核線程。

·ksmtuned服務控制和調試ksm,動態管理相同頁面合併。當內存共享不是必要的,ksmtuned服務啓動ksm和關閉ksm服務。ksmtuned服務必須被以返回參數告知來運行當來賓被創建或被銷燬。

這2個服務被標準的服務管理工具控制。

KSM服務

ksm服務被包含在qemu-kvm包裏面。KSM默認在Red Hat Enterprise Linux 6下

是關閉的。當使用Red Hat Enterprise Linux 6作爲一個KVM主機時,然而,它

很有可能被開啓由ksm/ksmtuned服務。

當ksm服務沒有啓動,KSM共享只有2000個頁面。這個默認值是低的並且提供

有效的內存節省效益。

當ksm服務器啓動,KSM將共享到主機系統的主內存一半。啓動ksm服務來開

啓KSM共享更多內存。

# service ksm start

Starting ksm: [ OK ]

ksm服務可以被添加到默認啓動順序。使用chkconfig命令讓ksm服務持久。

# chkconfig ksm on

KSM調試服務

ksmtuned服務沒有任何選項。ksmtuned服務循環並且調整ksm。當一個來賓被創建或銷燬,libvirt將通知ksmtuned服務。

# service ksmtuned start

Starting ksmtuned: [ OK ]

ksmtuned服務可以被返回參數調試。返回參數指示ksmtuned手動運行調試功能。

/etc/ksmtuned.conf文件是ksmtuned服務的配置文件。默認的ksmtuned.conf如下文件。

# Configuration file for ksmtuned.

# How long ksmtuned should sleep between tuning adjustments

# KSM_MONITOR_INTERVAL=60

# Millisecond sleep between ksm scans for 16Gb server.

# Smaller servers sleep more, bigger sleep less.

# KSM_SLEEP_MSEC=10

# KSM_NPAGES_BOOST=300

# KSM_NPAGES_DECAY=-50

# KSM_NPAGES_MIN=64

# KSM_NPAGES_MAX=1250

# KSM_THRES_COEF=20

# KSM_THRES_CONST=2048

# uncomment the following to enable ksmtuned debug information

# LOGFILE=/var/log/ksmtuned

# DEBUG = 1

配置文件中最重要的參數是KSM_SLEEP_MSEC。Fedora 16使用的默認值是大型服務器的設置值。當在主機上運行較少的虛擬機,使用KSM時最好讓主機休眠更長的時間。例如,嘗試設置KSM_SLEEP_MSEC=50,然後測試對虛擬機的影響。

KSM變量和監視

KSM存儲監視數據在/sys/kernel/mm/ksm/目錄。在這個目錄的文件被內核更新並且精確記錄KSM的使用和統計。

以下變量同樣是/etc/ksmtuned.conf文件裏的配置變量。

/sys/kernel/mm/ksm文件

full_scans

全掃描運行。

pages_shared

總的共享頁面

pages_sharing

目前共享的頁面

pages_to_scan

頁面沒有掃描

pages_unshared

頁面不再共享。

pages_volatile

Volatile頁面的數目

run

KSM進程是否運行。

sleep_millisecs

睡眠多少毫秒

如果DEBUG=1被添加到/etc/ksmtuned.conf文件裏,KSM調試活動被存儲在/var/log/ksmtuned日誌文件。日誌文件的位置可以被改變通過LOGFILE參數。改變日誌文件的位置是不建議的,而且可能需要在SELinux設置中特定配置。

關閉KSM

KSM在某些環境或主機系統中可能性能開銷太大。如果目標是運行儘可能多的虛擬機,而且性能不是問題,應該保持KSM處於運行狀態。例如KSM允許運行30個虛擬機的主機上運行40個虛擬機,這意味着最大化硬件使用效率。但是,如果服務器在運行相對較少的虛擬機並且性能是個問題時,那麼應該關閉KSM。

對任何系統來說,最佳選擇將取決於創建虛擬環境時的內存估算。如果在虛擬主機中有足夠的物理內存,在沒有開啓KSM時就能夠滿足虛擬機的內存需求,那麼最好關閉KSM。

KSM可以通過停止ksm服務和ksmtuned服務來關閉。關閉服務停止KSM但是在重啓後不會持久。

# service ksm stop

Stopping ksm: [ OK ]

# service ksmtuned stop

Stopping ksmtuned: [ OK ]

永久停止KSM通過chkconfig命令。關閉這兩個服務通過運行下面命令:

# chkconfig ksm off

# chkconfig ksmtuned off

重要:確保swap大小是足夠的對於承諾的RAM甚至是KSM。KSM減少RAM相同的利用或相似的來賓。超量使用來賓和KSM特性沒有足夠的swap空間可能但是這是不建議的,因爲來賓內存使用可以導致頁面變的獨享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章