在雙路物理CPU機器上安裝Ubuntu并部署KVM以實現系統多開,并追求性能最優,需要從硬件、宿主機系統、KVM配置、虛擬機配置等多個層面進行優化。
以下是詳細的操作指南和優化建議:
階段一:BIOS/UEFI 設置優化 (重啟進入)
-
啟用虛擬化技術:
-
Intel CPU: Intel VT-x (Virtualization Technology)
-
AMD CPU: AMD-V (SVM - Secure Virtual Machine)
-
通常在 CPU Configuration 或 Advanced Settings 中。
-
-
啟用 IOMMU (Input/Output Memory Management Unit):
-
Intel CPU: Intel VT-d (Virtualization Technology for Directed I/O)
-
AMD CPU: AMD-Vi
-
這對于PCI設備直通 (passthrough) 非常重要,能顯著提升某些VM的I/O性能。
-
-
禁用不必要的設備:
-
如果某些板載設備(如串口、并口、不用的聲卡)VM用不到,可以在BIOS中禁用,以釋放中斷資源。
-
-
內存設置:
-
確保內存運行在支持的最高頻率。
-
如果支持,啟用NUMA (Non-Uniform Memory Access)。雙路CPU幾乎必然是NUMA架構。
-
-
電源管理:
-
將電源管理配置文件設置為 "高性能" (High Performance) 或類似選項。避免節能模式降低CPU頻率。
-
禁用C-states (CPU idle states) 或者使用?intel_idle.max_cstate=0?或?processor.max_cstate=0?內核參數(后續宿主機優化中會提到),以減少CPU喚醒延遲,但會增加功耗。需要權衡。
-
階段二:Ubuntu Server 安裝
-
選擇最新LTS版本:?推薦使用最新的Ubuntu Server LTS版本(如22.04 LTS),以獲得較新的內核和KVM/QEMU版本,通常包含性能改進和新特性。
-
最小化安裝:?選擇 "Minimal installation" 或只安裝必要的核心組件,避免不必要的軟件包和服務消耗資源。
-
磁盤分區:
-
OS盤:?建議使用SSD,分配足夠的空間給?/?(根目錄) 和?/boot。
-
VM存儲盤:
-
高性能方案:?使用高速NVMe SSD或SSD RAID陣列。
-
大容量方案:?可以使用HDD RAID,但性能會遠低于SSD。
-
分區策略:
-
LVM (Logical Volume Manager):?推薦使用LVM管理VM存儲,方便動態調整、快照等。在LVM上創建邏輯卷來存放VM鏡像。
-
單獨分區:?也可以直接使用單獨的分區(如?/var/lib/libvirt/images?掛載到獨立的高速磁盤分區)。
-
-
-
Swap分區:?如果物理內存充足(例如64GB+),可以設置較小的Swap(如4-8GB)或不設置,依賴物理內存。如果內存可能緊張,適當設置Swap。
-
階段三:KVM及相關工具安裝
sudo apt update
sudo apt upgrade -y# 安裝KVM及管理工具
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager cpu-checker# 檢查KVM是否可用
sudo kvm-ok
# 輸出應包含 "KVM acceleration can be used"# 將當前用戶添加到libvirt和kvm組,以便無需sudo管理VM
sudo adduser $(whoami) libvirt
sudo adduser $(whoami) kvm
# 注意:需要重新登錄或重啟使組更改生效# 啟動并設置libvirtd服務開機自啟
sudo systemctl enable --now libvirtd
sudo systemctl status libvirtd
content_copydownload
Use code?with caution.Bash
階段四:宿主機系統性能優化
-
CPU調速器 (CPU Governor):
-
將其設置為?performance?模式,讓CPU以最高頻率運行。
sudo apt install cpufrequtils -y echo 'GOVERNOR="performance"' | sudo tee /etc/default/cpufrequtils sudo systemctl disable ondemand # 如果存在 sudo systemctl restart cpufrequtils # 或重啟系統 # 驗證 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
content_copydownload
Use code?with caution.Bash -
-
NUMA優化:?雙路CPU系統是NUMA架構,優化NUMA至關重要。
-
安裝NUMA工具:
sudo apt install numactl -y
content_copydownload
Use code?with caution.Bash -
查看NUMA拓撲:
numactl --hardware lscpu | grep NUMA
content_copydownload
Use code?with caution.Bash -
綁定服務到NUMA節點:?盡量將libvirtd服務和相關的qemu-system-*進程綁定到特定的NUMA節點,或者至少讓它們均勻分布。通常libvirtd自身不需要嚴格綁定,但它啟動的QEMU進程(即VM)需要。
-
IRQ平衡:?確保irqbalance服務運行,它會嘗試將硬件中斷分配到不同的CPU核心,避免單核瓶頸。
sudo systemctl enable --now irqbalance
content_copydownload
Use code?with caution.Bash對于高性能網絡和存儲,有時需要手動調整IRQ親和性,將特定設備的IRQ綁定到VM vCPU所在的NUMA節點的CPU核心上。
-
-
內核參數優化 (GRUB):
-
編輯?/etc/default/grub?文件,修改?GRUB_CMDLINE_LINUX_DEFAULT?行。
-
常用參數:
-
intel_iommu=on?或?amd_iommu=on?(如果BIOS中已啟用,這里可以再次確認或強制啟用,對PCI直通重要)
-
isolcpus=<cpu_list>: 隔離部分CPU核心專門給VM使用,宿主機不調度普通進程到這些核心。需要仔細規劃,例如將某些核心完全留給特定高性能VM。
-
nohz_full=<cpu_list>: 針對isolcpus指定的CPU核心禁用內核時鐘滴答,減少VM抖動。
-
rcu_nocbs=<cpu_list>: 減少RCU回調對隔離CPU的干擾。
-
transparent_hugepage=never?或?transparent_hugepage=madvise:
-
never: 完全禁用透明大頁,手動為VM配置靜態大頁 (HugePages) 性能更好。
-
madvise: 僅在應用程序通過madvise()請求時使用THP,是一個折中。
-
對于KVM,如果打算使用靜態HugePages,則應禁用THP。
-
-
elevator=noop?或?elevator=none?(對于SSD/NVMe): 設置I/O調度器為?noop?(或?none?for NVMe),因為SSD有自己的內部調度邏輯。
-
也可以通過udev規則設置:?echo noop > /sys/block/sdX/queue/scheduler
-
-
-
示例:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on transparent_hugepage=never elevator=none" -
更新GRUB后生效:
sudo update-grub sudo reboot
content_copydownload
Use code?with caution.Bash
-
-
HugePages (靜態大頁):
-
減少TLB (Translation Lookaside Buffer) miss,提高內存密集型應用性能。
-
VM內存應配置為使用HugePages。
-
計算所需大頁數量:?(VM總內存 / HugePage大小)。常見HugePage大小為2MB或1GB。
# 查看支持的HugePage大小 cat /proc/meminfo | grep Hugepagesize # 假設Hugepagesize: 2048 kB (2MB) # 如果要給VM分配32GB內存,需要 32 * 1024 / 2 = 16384 個2MB大頁 # 預留 (在 /etc/sysctl.conf 或 .conf 文件中) # sudo sysctl -w vm.nr_hugepages=16384 # 或在啟動時通過內核參數:hugepages=16384 # 永久生效: echo "vm.nr_hugepages=16384" | sudo tee -a /etc/sysctl.conf sudo sysctl -p
content_copydownload
Use code?with caution.Bash -
確保在VM的XML配置中啟用HugePages。
-
-
網絡優化:
-
使用橋接網絡 (Bridged Networking):?virsh net-define,?virsh net-start,?virsh net-autostart?或使用?virt-manager?創建。橋接提供接近物理網絡的性能,VM像獨立主機一樣在局域網中。
-
vhost-net:?確保啟用。KVM默認會使用vhost-net,它將網絡包處理移到內核空間,減少上下文切換,提高性能。
lsmod | grep vhost_net # 應該能看到模塊加載
content_copydownload
Use code?with caution.Bash -
SR-IOV (Single Root I/O Virtualization):?如果網卡和主板支持,這是網絡性能的極致。它允許物理網卡虛擬出多個VF (Virtual Function),直接分配給VM,VM擁有近乎獨占的網卡硬件資源。配置較復雜。
-
階段五:虛擬機 (VM) 創建與優化
使用?virt-manager?(圖形化) 或?virsh?(命令行) 創建和管理VM。以下是優化點,主要通過編輯VM的XML配置文件 (virsh edit <vm_name>) 實現。
-
CPU配置 (<vcpu>,?<cputune>):
-
CPU模式 (<cpu mode='...' ...>):
-
host-passthrough: 將宿主機CPU特性完整透傳給VM,通常性能最好,但VM遷移可能受限于目標主機的CPU型號。
-
host-model: 模擬宿主機CPU型號,提供較好的性能和一定的遷移兼容性。
-
避免使用通用CPU型號 (如?qemu64,?kvm64),除非為了最大化遷移兼容性。
-
-
vCPU數量 (<vcpu placement='static' current='X'>X</vcpu>):?按需分配,不要過度分配。current屬性設為與最大vcpu數一致。
-
CPU釘扎/親和性 (<vcpupin>):
-
關鍵優化!?將VM的vCPU綁定到宿主機的特定物理核心上,特別是綁定到同一NUMA節點的核心上。
-
避免VM的vCPU在不同NUMA節點的物理核心間遷移,這會導致嚴重的性能下降。
-
示例 (假設VM有2個vCPU,要綁定到物理CPU 0和1):
<cputune><vcpupin vcpu="0" cpuset="0"/><vcpupin vcpu="1" cpuset="1"/><!-- 如果有更多vCPU和物理核心,繼續添加 --> </cputune>
content_copydownload
Use code?with caution.Xml
-
-
NUMA感知 (<numatune>):
-
將VM的內存也分配到其vCPU所在的NUMA節點上。
-
示例 (VM內存分配到宿主機NUMA節點0):
<numatune><memory mode="strict" nodeset="0"/><!-- 如果VM本身也模擬NUMA,則需要更復雜的配置 --> </numatune>
content_copydownload
Use code?with caution.Xml -
如果VM本身也需要模擬NUMA架構(例如,大型數據庫VM),則需要更細致的配置,將VM的虛擬NUMA節點映射到宿主機的物理NUMA節點。
<cpu ...><numa><cell id='0' cpus='0-1' memory='2048' unit='MiB'/> <!-- VM的NUMA節點0用vCPU 0-1,2GB內存 --><!-- ... --></numa> </cpu> <numatune><memnode cellid='0' mode='strict' nodeset='0'/> <!-- VM節點0的內存來自宿主機節點0 --> </numatune>
content_copydownload
Use code?with caution.Xml
-
-
-
內存配置 (<memory>,?<memoryBacking>):
-
分配大小:?按需分配。
-
HugePages:
<memoryBacking><hugepages/> </memoryBacking>
content_copydownload
Use code?with caution.Xml確保宿主機已配置足夠的HugePages。
-
內存鎖定 (<locked/>):?防止VM內存被交換到磁盤。
<memoryBacking><hugepages/><locked/> </memoryBacking>
content_copydownload
Use code?with caution.Xml
-
-
磁盤I/O優化 (<disk>):
-
磁盤總線 (<disk type='file' device='disk'> <driver name='qemu' type='...' cache='...' io='...'/> ... </disk>):
-
virtio-blk: 傳統的半虛擬化塊設備,性能不錯。
-
virtio-scsi: 更現代,支持更多SCSI特性(如TRIM/UNMAP),通常推薦用于SSD。需要?<controller type='scsi' model='virtio-scsi'/>。
-
-
鏡像格式 (type):
-
raw: 性能最好,無額外開銷,但不支持快照、動態擴展等特性。
-
qcow2: 功能豐富(快照、寫時復制、壓縮、加密),但有性能開銷。
-
優化qcow2:
-
preallocation=metadata?或?preallocation=falloc?(創建時預分配,減少碎片)。
-
lazy_refcounts=on?(新版本qemu)。
-
-
-
-
緩存模式 (cache):
-
none: 宿主機不緩存,VM直接訪問存儲,適合VM內部有良好緩存機制或數據庫等應用。通常是SSD的最佳選擇。
-
writethrough: 寫操作同時寫入宿主機緩存和物理磁盤,數據安全,但寫入慢。
-
writeback: 寫操作先寫入宿主機緩存,后異步寫入物理磁盤,寫入快,但宿主機崩潰可能丟數據。
-
directsync: 類似none,但使用O_DIRECT | O_SYNC。
-
unsafe: 僅用于測試,完全依賴宿主機緩存,不保證數據一致性。
-
-
I/O模式 (io):
-
native: 使用Linux AIO (Asynchronous I/O),通常是最佳性能選擇。
-
threads: 使用QEMU用戶空間的線程池處理I/O。
-
-
I/O線程 (<iothreads>X</iothreads>,?<iothreadids>):
-
為VM分配專用的I/O處理線程,減少主QEMU線程的I/O壓力。
-
示例 (分配1個iothread):
<iothreads>1</iothreads> ... <disk type='file' device='disk'><driver name='qemu' type='qcow2' cache='none' io='native'/><source file='/path/to/vm.qcow2'/><target dev='vda' bus='virtio'/><iotune> <!-- 可選,精細控制 --><total_bytes_sec>...</total_bytes_sec><total_iops_sec>...</total_iops_sec></iotune><address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/><iothread_ids> <!-- 僅virtio-scsi支持綁定到特定iothread --><iothread id="1"/></iothread_ids> </disk>
content_copydownload
Use code?with caution.Xml -
對于virtio-blk,可以通過?driver ... queue_size=N?調整隊列深度,并結合?<blkiotune>?進行IO限速。
-
-
塊大小 (<blockio logical_block_size='512' physical_block_size='4096'/>):?如果底層物理磁盤是4K扇區 (Advanced Format),對齊VM的塊大小可以提高性能。
-
-
網絡I/O優化 (<interface>):
-
設備模型 (<model type='virtio'/>):?始終使用?virtio?(virtio-net),這是半虛擬化網卡,性能遠超模擬的?e1000?或?rtl8139。
-
多隊列Virtio-net (queues='N'):
-
允許VM有多個收發隊列,每個隊列可以由不同的vCPU處理,提高網絡吞吐和并發。
-
N?通常設置為VM的vCPU數量,但不超過網卡物理隊列數(如果是SR-IOV)或宿主機支持的隊列數。
-
示例:
<interface type='bridge'><source bridge='br0'/><model type='virtio'/><driver name='vhost' queues='4'/> <!-- 假設VM有4個vCPU --><address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
content_copydownload
Use code?with caution.Xml
-
-
SR-IOV (如前所述):?如果硬件支持,配置?<interface type='hostdev' managed='yes'>?并指定PF的VF。
-
-
顯卡 (<video>):
-
對于服務器VM,通常不需要強大的圖形性能。使用?virtio?顯卡模型,或?none?(如果通過串行控制臺管理)。
-
<model type='virtio' heads='1' primary='yes'/>
-
如果完全不需要圖形界面,可以移除<graphics>和<video>部分,僅保留<console>。
-
階段六:虛擬機內部 (Guest OS) 優化
-
安裝Virtio驅動:?現代Linux發行版通常自帶Virtio驅動。Windows VM需要手動安裝Virtio驅動 (從Fedora項目下載ISO)。
-
Guest OS調優:
-
關閉不必要的服務。
-
I/O調度器:?對于virtio-blk或virtio-scsi設備,在VM內部也建議使用?noop?或?none?(NVMe) 或?mq-deadline?(新內核)。
# 在VM內部執行 echo 'noop' > /sys/block/vda/queue/scheduler # 假設VM磁盤是vda
content_copydownload
Use code?with caution.Bash -
網絡參數:?調整TCP/IP棧參數,如增大緩沖區等,根據應用類型而定。
-
時間同步:?確保VM時間與宿主機同步,KVM通常會自動處理,但檢查一下沒壞處 (chrony?或?systemd-timesyncd)。
-
階段七:持續監控與調整
-
宿主機監控:
-
top,?htop?(查看CPU、內存占用)
-
vmstat,?iostat,?sar?(系統活動、I/O統計)
-
numastat -m <qemu_pid>?(查看VM在NUMA節點間的內存分布)
-
perf top -p <qemu_pid>?(分析VM進程的熱點函數)
-
virsh domstats <vm_name>?(獲取VM的各種統計信息)
-
virt-top?(類似top,但針對VM)
-
-
VM內部監控:?使用VM內部的監控工具。
-
基準測試:?在優化前后進行基準測試(如?fio?for disk I/O,?iperf?for network,?sysbench?for CPU/memory),量化優化效果。
-
迭代優化:?性能優化是一個持續的過程。根據監控結果和應用需求,不斷調整配置。
重要注意事項:
-
** workload特性:** 不同的VM應用(如Web服務器、數據庫、計算密集型任務)對資源的需求和瓶頸點不同,優化策略應有所側重。
-
穩定性優先:?不要為了極致性能而犧牲穩定性。某些激進的優化可能導致系統不穩定。
-
逐步調整:?每次只修改一個或少數幾個相關參數,測試效果,避免一次性改動過多難以定位問題。
-
備份:?在進行重大配置更改前,備份宿主機和VM的重要數據及配置文件。
-
文檔:?記錄你的優化步驟和參數,方便后續維護和問題排查。
對于雙路CPU,NUMA親和性 (CPU和內存綁定到同一NUMA節點)?是最關鍵的優化點之一。其次是使用Virtio驅動和設備,然后是磁盤I/O (緩存模式、I/O模式、鏡像格式)?和網絡I/O (多隊列、vhost-net)。HugePages對內存密集型應用也非常有益。
遵循這些步驟,你的KVM環境應該能達到相當高的性能水平。祝你成功!