技術討論區 > Virtualization 虛擬化技術
[筆記]KVM效能調較
netman:
最近由於有個產品做POC需要不斷的測試Win7系統,於是用Linux跑KVM來做虛擬化平台。
開始發現預設用IDE模式裝Win7真的是慢到靠北啊~
原來要用virtio啊?
but我裝的CentOS裡面的virt-manager沒有這個選項啊?連SATA都沒有!orz
用指令當然可以,但我還是想用virt-manager啦~
於是砍掉裝Ubuntu Server 14.04 LTS,啊?也是沒有!雖然有SATA可以選...
不行,我就是要virt-manager裡面有virtio的!(握拳
砍掉裝Ubuntu Desktop 14.04 LTS,這次有了!耶~ ^_^
但安裝時不能直接用virtio喔,要先用SATA裝完,再加一個新的hdd用virtio,
同時下載virtio-win-xxxxxx.iso並且掛載進來,到Win7的設備管理員裡面把所有問號都跟新驅動程式。
關機後移除新HDD,把原HDD改為virtio,這樣就可以了!
還有,因為要拍snapshot,所以虛擬硬碟要用qcow2,如果之前用其他的格式,可以用qemu-img convert來轉換即可。
不過,單獨開一台win7還好,如果開到第三台就非常非常慢!
於是google了一下kvm performance tuning的文章,Redhat跟IBM都有不錯的文章可以參考。照做應該差不多了。
下面是我整理的一些調整:
1. 把/var/lib/libvirt/image獨立出來,掛載使用這些選項:
defaults,noatime,commit=60,barrier=0,nobh
2. 為kernel設定參數,修改/etc/sysctl.conf:
vm.swappiness=0
vm.dirty_background_ratio=50
vm.dirty_ratio=80
net.core.wmem_max=4194304
net.core.rmem_max=4194304
vm.zone_reclaim_mode=0
完成後執行 sysctl -p
3. 在virt-manager中修改virtio disk參數:
Cache mode: writeback
IO mode: threads
4. 確認/sys/block/sda/queue/scheduler 使用 deadline
5. 爲 qxl 設定更多 RAM (virsh edit vn_name)
<model type='qxl' ram='131072' vram='131072' vgamem='65536' heads='1'/>
基本這些...
關鍵是1,2的設定,主要是減少swap的產生,把disk sync的同步次數降低,然後是把file system journaling頻率降低。
但如果碰到意外斷電,檔案損毀的機率也大很多就是了。
當然了,記憶體是一定不能少的啦~~ ^_^
如果能用SSD就更理想了,but...我目前只有一個SATA而已。
機器支援NUMA也很有幫助,不過我的機器沒有!Orz
聽說用raw partition/disk也可以提升效能,但因為我一定要用snapshot,所以就沒測到這個部分了。
現在同時跑4-5台Win7都還算OK,不過有時在linux host上面會卡卡,但vm裡面的win7就順暢很多了~~ ^_^
more ref:
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/pdf/Virtualization_Tuning_and_Optimization_Guide/Red_Hat_Enterprise_Linux-7-Virtualization_Tuning_and_Optimization_Guide-en-US.pdf
http://everything2.com/title/Filesystem+performance+tweaking+with+XFS+on+Linux
netman:
因為我要同時一次就要拍好幾台vm的快照,也要同時倒會道不同的快照階段去,於是寫了一隻script方便自己操作。
如果有需要的朋友,也可以拿去用哦~~
--- 代碼: ---#!/bin/bash
#
# To handle batch jobs with KVM snapshot
#
PATH=/usr/sbin:/usr/bin:/sbin:/bin
vm_dir=/etc/libvirt/qemu
vm_cmd=virsh
trap "echo Canceling $0 ...; exit 2" 2 3 15
[ $(id -u) -eq 0 ] || {
echo Please run script as root, or: sudo $0 "$@"
echo
exit 1
}
_confirm() {
while : ; do
echo -en "$* (y|N) "
read -n 1 -s anw
echo
[ "$anw" ] || anw=n
case $anw in
[nN]|[nN][oO])
return 1
;;
[yY]|[yY][eE][sS])
return 0
;;
*)
echo "Please answer Yes of No, or just press ENTER for No."
;;
esac
done
}
show_msg() {
echo "Usage: $0 <option>"
echo -e "Valid Options:"
echo -e "\tstart [vm_name ...|all]"
echo -e "\tshutdown [vm_name ...|all]"
echo -e "\tdestroy <vm_name ...|all>"
echo -e "\tstatus [vm_name ...|all]"
echo -e "\tsn_list [vm_name ...|all]"
echo -e "\tsn_revert <vm_name sn_name|all sn_name>"
echo -e "\tsn_del <vm_name sn_name|all sn_name>"
echo -e "\tsn_ca <vm_name sn_name|all sn_name>"
echo
}
show_warn_novmname() {
echo "Warning: vm named $1 is not found."
}
show_warn_nosnname() {
echo "Warning: snapshot named $2 for vm $1 is not found."
}
get_all_vm() {
for i in $vm_dir/*.xml; do
echo ${i##*/} | sed 's/.xml$//'
done | xargs
}
check_vm_name() {
get_all_vm | egrep -wq $1
}
check_vm_run() {
$vm_cmd list | tail -n +3 | awk '{print $2}' | egrep -qw $1
}
check_sn_name() {
sn_list $1 | tail -n +2 | awk '{print $1}' | egrep -wq "^$2$"
}
start() {
for i in "$@"; do
check_vm_name $i || { show_warn_novmname $i; continue; }
check_vm_run $i && { echo "vm $i is already running."; continue; }
[ "$set_all" = 1 ] && { _confirm "Are you sure to start vm $i?" || { echo; continue; }; }
echo -en "Starting $i ..."
$vm_cmd start $i &>/dev/null && echo -e " Done!" || echo -e " Failed!"
done
echo
}
shutdown() {
for i in "$@"; do
check_vm_name $i || { show_warn_novmname $i; continue; }
check_vm_run $i || continue
echo -en "Shutting down $i ..."
$vm_cmd shutdown $i &>/dev/null && echo -e " Done!" || echo -e " Failed!"
done
}
destroy() {
for i in "$@"; do
check_vm_name $i || { show_warn_novmname $i; continue; }
check_vm_run $i || continue
[ "$set_all" = 1 ] && { _confirm "Are you sure to destroy vm $i?" || continue; }
echo -en "Force shutting down $i ..."
$vm_cmd destroy $i &>/dev/null && echo -e " Done!" || echo -e " Failed!"
done
}
status() {
for i in "$@"; do
check_vm_name $i || { show_warn_novmname $i; continue; }
echo -en "\t$i \t\t: "
echo $($vm_cmd domstate $i)
done
}
sn_list() {
for i in "$@"; do
check_vm_name $i || { show_warn_novmname $i; continue; }
echo -e "$i :"
$vm_cmd snapshot-list $i | tail -n +3
done
}
sn_revert() {
check_vm_name $1 || { show_warn_novmname $1; return; }
check_sn_name $1 $2 || { show_warn_nosnname $1 $2; return; }
echo -en "Reverting $1 to snapshot $2 ..."
$vm_cmd snapshot-revert $1 $2 &>/dev/null && echo -e " Done!" || echo -e " Failed!"
}
sn_del() {
check_vm_name $1 || { show_warn_novmname $1; return; }
check_sn_name $1 $2 || { show_warn_nosnname $1 $2; return; }
echo -en "Deleting snapshot $2 from vm $1 ..."
$vm_cmd snapshot-delete $1 $2 &>/dev/null && echo -e " Done!" || echo -e " Failed!"
}
sn_ca() {
check_vm_name $1 || { show_warn_novmname $1; return; }
check_sn_name $1 $2 && { echo "WARNIG: snapshot $2 for $1 is already existed."; return; }
echo -en "Creating snapshot $2 for vm $1 ..."
$vm_cmd snapshot-create-as $1 $2 &>/dev/null && echo -e " Done!" || echo -e " Failed!"
}
case $1 in
start)
if [ -z "$2" -o "$2" = all ]; then
set_all=1
start $(get_all_vm)
else
shift 1
start "$@"
fi
;;
shutdown)
if [ -z "$2" -o "$2" = all ]; then
_confirm "Are you sure to shutdown ALL vm?" || { echo ; exit 0; }
echo
shutdown $(get_all_vm)
else
shift 1
shutdown "$@"
fi
;;
destroy)
if [ -z "$2" ]; then
show_msg
elif [ "$2" = all ]; then
set_all=1
destroy $(get_all_vm)
else
shift 1
destroy "$@"
fi
;;
status)
if [ -z "$2" -o "$2" = all ]; then
status $(get_all_vm)
else
shift 1
status "$@"
fi
;;
sn_list)
if [ -z "$2" -o "$2" = all ]; then
sn_list $(get_all_vm)
else
shift 1
sn_list "$@"
fi
;;
sn_revert)
if [ -z "$3" ]; then
show_msg
elif [ "$2" = all ]; then
for i in $(get_all_vm); do
sn_revert $i $3
done
else
sn_revert $2 $3
fi
;;
sn_del)
if [ -z "$3" ]; then
show_msg
elif [ "$2" = all ]; then
for i in $(get_all_vm); do
_confirm "Are you sure to delele snapshot $3 from vm $i?" || continue
sn_del $i $3
done
else
sn_del $2 $3
fi
;;
sn_ca)
if [ -z "$3" ]; then
show_msg
elif [ "$2" = all ]; then
for i in $(get_all_vm); do
sn_ca $i $3
done
else
sn_ca $2 $3
fi
;;
*)
show_msg
echo "VM status:"
status $(get_all_vm)
;;
esac
echo
--- 程式碼結尾 ---
kckcp:
CPU & RAM 大約是什麼 , 還有HD 大少?
--- 引述: netman 於 2014-07-04 16:29 ---最近由於有個產品做POC需要不斷的測試Win7系統,於是用Linux跑KVM來做虛擬化平台。
開始發現預設用IDE模式裝Win7真的是慢到靠北啊~
原來要用virtio啊?
but我裝的CentOS裡面的virt-manager沒有這個選項啊?連SATA都沒有!orz
用指令當然可以,但我還是想用virt-manager啦~
於是砍掉裝Ubuntu Server 14.04 LTS,啊?也是沒有!雖然有SATA可以選...
不行,我就是要virt-manager裡面有virtio的!(握拳
砍掉裝Ubuntu Desktop 14.04 LTS,這次有了!耶~ ^_^
但安裝時不能直接用virtio喔,要先用SATA裝完,再加一個新的hdd用virtio,
同時下載virtio-win-xxxxxx.iso並且掛載進來,到Win7的設備管理員裡面把所有問號都跟新驅動程式。
關機後移除新HDD,把原HDD改為virtio,這樣就可以了!
還有,因為要拍snapshot,所以虛擬硬碟要用qcow2,如果之前用其他的格式,可以用qemu-img convert來轉換即可。
不過,單獨開一台win7還好,如果開到第三台就非常非常慢!
於是google了一下kvm performance tuning的文章,Redhat跟IBM都有不錯的文章可以參考。照做應該差不多了。
下面是我整理的一些調整:
1. 把/var/lib/libvirt/image獨立出來,掛載使用這些選項:
defaults,noatime,commit=60,barrier=0,nobh
2. 為kernel設定參數,修改/etc/sysctl.conf:
vm.swappiness=0
vm.dirty_background_ratio=50
vm.dirty_ratio=80
net.core.wmem_max=4194304
net.core.rmem_max=4194304
vm.zone_reclaim_mode=0
完成後執行 sysctl -p
3. 在virt-manager中修改virtio disk參數:
Cache mode: writeback
IO mode: threads
4. 確認/sys/block/sda/queue/scheduler 使用 deadline
基本這些...
關鍵是1,2的設定,主要是減少swap的產生,把disk sync的同步次數降低,然後是把file system journaling頻率降低。
但如果碰到意外斷電,檔案損毀的機率也大很多就是了。
當然了,記憶體是一定不能少的啦~~ ^_^
如果能用SSD就更理想了,but...我目前只有一個SATA而已。
機器支援NUMA也很有幫助,不過我的機器沒有!Orz
聽說用raw partition/disk也可以提升效能,但因為我一定要用snapshot,所以就沒測到這個部分了。
現在同時跑4-5台Win7都還算OK,不過有時在linux host上面會卡卡,但vm裡面的win7就順暢很多了~~ ^_^
--- 引用結尾 ---
netman:
CPU:
i5 CPU 650 @ 3.20GHz
RAM:
total used free shared buffers cached
Mem: 16126616 15850696 275920 4740220 344996 14250376
-/+ buffers/cache: 1255324 14871292
Swap: 30670844 2236 30668608
HDD:
ST500DM002-1BD14(500GB 7200 RPM ) x3 做 RAID0
edwardleung:
您好,
請問如有raid 卡的話, 不知 Seagate 那個系列的 SATA 可以考慮 ?
謝謝 ^^
導覽
[0] 文章列表
[#] 下頁
前往完整版本