關于KVM 虛擬化注意的二三事整理

      網友投稿 1104 2022-05-28

      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: 要求源節點和目的節點的指令集完全一致

      關于KVM 虛擬化注意的二三事整理

      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 fe1f692d-34d5-4e0c-ab36-ba84eb024ee5 …… ……

      定義 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:

      # cache 可為 writeback, none, writethrough,directsync,unsafe 等 ...

      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 網絡吞吐量。

      ... # queues=N

      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小時內刪除侵權內容。

      上一篇:【數據結構與算法】之深入解析“自由之路”的求解思路與算法示例
      下一篇:8皇后以及N皇后算法探究,回溯算法的JAVA實現,非遞歸,數據結構“?!睂崿F
      相關文章
      亚洲乱码中文字幕在线| 在线亚洲97se亚洲综合在线 | 亚洲人成人网站在线观看| 亚洲熟妇无码AV| 亚洲看片无码在线视频| 亚洲成aⅴ人片在线观| 亚洲福利电影在线观看| 亚洲韩国在线一卡二卡| 久久丫精品国产亚洲av不卡| 亚洲精品综合一二三区在线| 亚洲欧洲第一a在线观看| 亚洲一区二区免费视频| 亚洲人成电影青青在线播放| 亚洲另类古典武侠| 亚洲六月丁香婷婷综合| 亚洲国产日韩精品| 亚洲午夜成人精品无码色欲| 亚洲日本VA午夜在线影院| 亚洲国产精品18久久久久久 | 亚洲va久久久噜噜噜久久| 亚洲AV永久纯肉无码精品动漫| 亚洲国产精品无码久久SM | 亚洲高清国产拍精品26U| 亚洲AV区无码字幕中文色| 亚洲AV区无码字幕中文色| 亚洲综合区图片小说区| 亚洲一区二区三区亚瑟| 亚洲日韩精品无码专区加勒比 | 亚洲精品中文字幕| 另类专区另类专区亚洲| 亚洲天堂在线视频| 亚洲乱码无码永久不卡在线| 亚洲成av人片天堂网| 亚洲综合久久综合激情久久 | 亚洲精品久久久www| 亚洲国产一成人久久精品| 亚洲AV电影院在线观看| 亚洲妇女水蜜桃av网网站| 精品国产成人亚洲午夜福利| 国产精品国产亚洲区艳妇糸列短篇 | 激情无码亚洲一区二区三区|