關于KVM 虛擬化注意的二三事整理
CPU mode 的選取
性能
熱遷移
穩定性
應用移植
CPU mode 的選取
性能
熱遷移
穩定性
應用移植
搭建幾點
初始化網卡
分區
VM 網絡
安裝軟件包
libvirtd 日志
快速克隆VM
本機克隆
復制配置文件和硬盤文件跨機克隆
性能優化
CPU優化
內存優化
關閉 KSM
打開 huge page
IO 優化
IO cache
調度算法
磁盤格式
網絡優化
啟用 vhost_net
網卡多隊列
小結
CPU mode 的選取
在 KVM 虛擬化中,大家對 CPU mode 的關注相對較少,多采用默認值。其實,CPU mode 的選取對 VM 的影響卻很大,如果考慮不周,可能會導致穩定性差,維護成本高,影響業務等一系列問題。本文從性能,熱遷移,穩定性,應用移植四個角度對 CPU mode 進行分析。
Libvirt 主要支持三種 CPU mode:
host-passthrough: libvirt 令 KVM 把宿主機的 CPU 指令集全部透傳給 VM 。因此 VM 能夠最大限度的使用宿主機 CPU 指令集,故性能是最好的。但是熱在遷移時,它要求目的節點的 CPU 和源節點的一致。
host-model: libvirt 根據當前宿主機 CPU 指令集從配置文件 /usr/share/libvirt/cpu_map.xml 選擇一種最相配的 CPU 型號。在這種 mode 下, VM 的指令集往往比宿主機少,性能相對 host-passthrough 要差一點,但是熱遷移時,它允許目的節點 CPU 和源節點的存在一定的差異。
custom: 這種模式下 VM CPU 指令集數最少,故性能相對最差,但是它在熱遷移時跨不同型號 CPU 的能力最強。此外,custom 模式下支持用戶添加額外的指令集。
性能
三種 mode 的性能排序如下:
host-passthrough > host-model > custom
但是它們的差距到底是多少呢,CERN 根據 HEPSpec06 測試標準給出了如下性能數據。
從上可以總結出:
這三種 CPU mode 的性能差距較小
除非某些應用對某些特殊指令集有需求,否則不太建議用
host-passthrough
,原因請見后續分析。
熱遷移
從理論上說:
host-passthrough: 要求源節點和目的節點的指令集完全一致
host-model: 允許源節點和目的節點的指令集存在輕微差異
custom: 允許源節點和目的節點指令集存在較大差異
故熱遷移通用性如下:
custom > host-model > host-passthrough
從實際情況來看,公司不同時間采購的 CPU 型號可能不相同;不同業務對 CPU 型號的要求也有差異。雖然常見多采用 intel E5 系列的 CPU,但是該系列的 CPU 也有多種型號,常見的有 Xeon,Haswell,IvyBridge,SandyBridge 等等。即使是 host-model,在這些不同型號的 CPU 之間熱遷移 VM 也可能失敗。所以從熱遷移的角度,在選擇 host-mode 時:
需要充分考慮既有宿主機類型,以后采購擴容時,也需要考慮相同問題;
除非不存在熱遷移的場景,否則不應用選擇 host-passthrough;
host-model 下不同型號的 CPU 最好能以 aggregate hosts 劃分,在遷移時可以使用 aggregate filter 來匹配相同型號的物理機;
如果 CPU 型號過多,且不便用 aggregate hosts 劃分,建議使用 custom mode;
穩定性
從使用經驗來看,host-model 和 custom 模式下的 VM 運行穩定,而 host-passthrough 則問題比較大,特別是在 centos6 內核下,常常出現宿主機 kernel panic 問題,如:
Redhat-6.4_64bit-guest kernel panic with cpu-passthrough and guest numa
所以從穩定性出發:
2.6 內核及更早內核版本避免使用 host-passthrough
custom/host-model 比較穩定
應用移植
對應用的影響主要體現在編譯型應用,如 C,C++,Golang。在物理機上編譯好的二進制應用,直接移植到 custom mode 的 VM 有可能出現 illegal instruction。其中最常見的 SSE4 類型指令集異常,因為 custom 模式下沒有 SSE4 指令集,而在物理機或者其它 mode 的 VM 是有該指令集的。
從經驗來看:
host-model 能夠平滑移植絕大部分編譯型二進制文件。
custom 下的 VM 如果出現 illegal instruction,在該 VM 重新編譯(有時需要修改編譯參數)應用后,一般能正常運行。
如果公司存在大量編譯型應用,host-model 能讓業務上云更平滑些。
搭建幾點
初始化網卡
因為 centos7 默認網卡發生改變,我們需要修改內核參數,使用 eth0 作為網卡:
光標移動到 Install CentOS 上,按 tab 鍵 輸入net.ifnames=0 biosdevname=0 回車
分區
我們不分交換分區,因為公有云上的云主機都是沒有交換分區的:
分配標準分區:
VM 網絡
重啟/etc/init.d/network restart 或者systemctl restart network
安裝軟件包
安裝的常用企業運維基礎工具包:
yum install tree nmap dos2unix lrzsz nc lsof wget tcpdump htop iftop iotop sysstat nethogs net-tools -y
libvirtd 日志
配置文件位置:
/etc/libvirt/libvirtd.conf
日志配置:
#將日志級別設置為 1(調試) log_level = 1 #指定日志輸出文件名稱 log_outputs="1:file:/var/log/libvirt/libvirtd.log" 注意: libvirtd. 日志文件可能會飛速增長。 用戶應配置logrotate ,否則 /var 文件系統最后會裝滿內容。 以上的日志的輸出級別為debug級別.這個級別的日志是最多的,一般只在開發以及測試的時候使用.而在生產運行環境中,日志的級別為info,warn,error,fatal. 以下前面的數字為他們的level. 1 debug 2 info 3 warn 4 error 5 fatal
重啟 libvirtd:
/etc/init.d/libvirtd restart
如果在目錄下還是沒發現日志文件,那么你可能需要使用一下命令來運行 libvirtd:
libvirtd --daemon --listen --config /etc/libvirt/libvirtd.conf
快速克隆VM
本機克隆
現有本地 VM 需要先停止。
查看本地VM:
$ virsh list --all Id 名稱 狀態 --------------------------------------------------- - vm-k8s 關閉
從 vm-k8s 克隆一個 vm-master1,執行克隆操作,使用磁盤文件 vm-master1.img
virt-clone -o generic -n vm-k8s -f /data/image/vm-master1.img
啟動 VM:
virsh start vm-master1
啟動后修改主機名、IP等
復制配置文件和硬盤文件跨機克隆
查看現有 VM:
$ virsh list --all Id Name State ---------------------------------------------------- 8 vm-k8s running
這里將從 vm-k8s 克隆另一個 vm-master2
導出 vm-k8s 配置文件
virsh dumpxml vm-k8s > vm-master2.xml
查看 vm-k8s 磁盤文件所在位置:
$ virsh edit vm-k8s
復制 vm-k8s 磁盤文件為 vm-master2.img
cd /data/image cp vm-k8s.img vm-master2.img
通過 SCP 把磁盤文件和配置文件復制到目標機器。
修改 vm-master2.xml:
定義 vm-master2 配置文件:
$ virsh define vm-master2.xml Domain vm-master2 defined from vm-master2.xml
此時會看到 vm-master2 已經生成
$ virsh list –all Id Name State ---------------------------------------------------- - vm-master2 shut off
啟動 vm-master2,重新更改主機名、IP等。
性能優化
CPU優化
kvm 是一個進程,是受 CPU 的調度,對于物理 CPU,同一個 core 的 threads 共享 L2 Cache,同一個 socket 的 cores 共享 L3 cache,所以 VM 的 vcpu 應當盡可能在同一個 core 和 同一個 socket 中,增加 cache 的命中率,從而提高性能。IBM 測試過,合理綁定 vcpu 能給 JVM 來的 16% 的性能提升。
VM vcpu 盡可能限定在一個 core 或者一個 socket 中。例如:當 vcpu 為 2 時,2 個 vcpu 應限定在同一個 core 中,當 vcpu 大于 2 小于 12 時,應限定在同一個 socket 中。
我們可以使用 taskset 來進行操作:
$ taskset -cp 0 8337 pid 8337's current affinity list: 0-3 # 表示當前8337會在0-3CPU上調度 pid 8337's new affinity list: 0 #表示當前8337會在cpu0上進行調度 8377 是進程號,通過 ps -ef|grep kvm 來獲取到 -p pid 指定進程 -c 指定cpu(可以寫多個)
提示:可以減少開機 miss,性能可以提高10%
內存優化
當 Linux 啟用了KSM 之后,KSM 會檢查多個運行中的進程,并比對它們的內存。如果任何區域或者分頁是一樣的,KSM 就會毫不猶豫地合并他們成一個分頁。 那么新分頁也是被標記成 copy on write。如果 VM 要修改內存的話,那么 Linux 就會分配新的內存給這個VM。
優點:
一個 VM 啟動,則只繼承了父進程(qemu-kvm)的內存。一臺 VM 的內存,可以讓相同操作系統或者運行相同應用的 VM共享。
當開啟了 KSM,常用的進程數據存在緩存和主內存中。這樣可以減少 VM 的緩存未命中,同時也提高了 VM 性能。
共享內存降低了 VM 的總體內存使用率,從而允許更高的密度和更大的資源利用率。
缺點:
利用 KSM 使內存超用。這會導致消耗一定的計算資源用于內存掃描,加重了 CPU 的消耗。內存超用,使得頻繁地使用 swap 交互,導致 VM 性能下降。
KSM使用了邊通道(side channels),可能存在泄露客戶信息的潛在風險。為此就要考慮在 VM 上關閉 KSM。
所以總結一下應用的場景:
生產環境慎用,應急時可開啟。
測試環境建議使用。
桌面虛擬化環境建議使用,但要注意內存使用情況。
關閉 KSM:
1)禁止某個訪客與其他訪客共享內存,XML文件可配置為:
2)禁止所有訪客直接共享內存,主機配置為:
echo 0 > /sys/kernel/mm/ksm/pages_shared echo 0 > /sys/kernel/mm/ksm/pages_sharing
KVM Guest 可以開啟大的頁內存支持,從而通過增加事務后備緩沖區(TLB)的 CPU 緩存命中率來提高性能。
打開透明大頁方式有兩種:
允許某個 Guest 開啟透明大頁
echo 25000 > /pro c/sys/vm/nr_hugepages mount -t hugetlbfs hugetlbfs /dev/hugepages service libvirtd restart
允許 Host 中所有 Guest 開啟透明大頁
echo always > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
IO 優化
kvm 就使用 virtio。
Virtio是一種半虛擬化技術,讓磁盤知道你是運行在 VM 里面。這是一種半虛擬化技術,有興趣可以了解一下。
kvm 支持多種 VM 多種 IO Cache 方式:writeback, none, writethrough 等。
性能上: writeback > none > writethrough
安全上: writeback < none < writethrough。
權衡安全性和性能,KVM 推薦使用 none:
Linux kernel 提供了三種 Disk IO 的調度策略,分別為 noop,deadline,cfq。(CentOS 6 有四種)
noop: noop is often the best choice for memory-backed block devices (e.g. ramdisks) and other non-rotational media (flash) where trying to reschedule I/O is a waste of resources
deadline: deadline is a lightweight scheduler which tries to put a hard limit on latency
cfq: cfq tries to maintain system-wide fairness of I/O bandwidth
相關資料:
http://www.cnblogs.com/zhenjing/archive/2012/06/20/linux_writeback.html
http://jackyrong.iteye.com/blog/898938
由于一個宿主機上會運行大量 VM ,為了防止某個因某個 VM 頻繁的 IO 操作影響其它 VM ,所以應該選擇 cfq 這種公平的調度策略。
查看當前調度算法
$ cat /sys/block/sda/queue/scheduler noop [deadline] cfq
更改調度算法如下:
echo “noop” > /syc/block/sda/queue/scheduler
KVM 常用 Raw 和 Qcow2 格式作為 VM 的鏡像文件。對 VM 而言,通俗的說,Raw 格式相當于裸盤,Qcow2 是 copy on write,二者對比如下:
性能:Raw > Qcow2
節省空間:Qcow2 > Raw
安全:Qcow2 > Raw
Qcow2 格式發展到現在,已經有和 Raw 相近的性能,同時能較好的節省空間,所以推薦使用 Qcow2 鏡像,但是要最大可能的發揮性能,使用 Raw 格式也未嘗不可。
網絡優化
VhostNet provides better latency (10% less than e1000 on my system) and greater throughput (8x the normal virtio, around 7~8 Gigabits/sec here) for network.
modprobe vhost-net
對 VM 而言,virtio-net 不能并行的處理網絡包,當網絡流量很大時,單個 vCPU 有限的處理能力將直接影響 VM 的網絡流量,所以可以通過多隊列的 virtio-net 提高 VM 網絡吞吐量。
vm 查看隊列是否生效:
$ ll /sys/class/net/eth0/queues/ 總用量 0 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-0 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-1 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-2 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-3 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-4 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-5 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-6 drwxr-xr-x 2 root root 0 12月 20 01:24 rx-7 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-0 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-1 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-2 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-3 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-4 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-5 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-6 drwxr-xr-x 3 root root 0 12月 20 01:24 tx-7
小結
最后用一張腦圖小結一下:
參考資料:
[1]:http://wsfdl.com/openstack/2018/01/02/libvirt_cpu_mode.html
[2]:http://wsfdl.com/openstack/2014/11/17/Nova-KVM性能調優.html
[3]:http://www.linux-kvm.org/page/Multiqueue
[4]:https://i4t.com/1627.html
KVM 任務調度 壓力測試
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。