作者 主題: [筆記]KVM效能調較  (閱讀 9985 次)

0 會員 與 1 訪客 正在閱讀本文。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
[筆記]KVM效能調較
« 於: 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

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
« 上次編輯: 2016-08-24 23:46 由 netman »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Re: [筆記]KVM效能調較
« 回覆 #1 於: 2014-07-04 16:34 »
因為我要同時一次就要拍好幾台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
« 上次編輯: 2015-11-23 10:24 由 netman »

kckcp

  • 可愛的小學生
  • *
  • 文章數: 1
    • 檢視個人資料
Re: [筆記]KVM效能調較
« 回覆 #2 於: 2015-02-17 14:39 »

CPU & RAM 大約是什麼 , 還有HD 大少?

最近由於有個產品做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

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Re: [筆記]KVM效能調較
« 回覆 #3 於: 2015-02-17 15:17 »
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

  • 俺是博士!
  • *****
  • 文章數: 1135
    • 檢視個人資料
Re: [筆記]KVM效能調較
« 回覆 #4 於: 2015-03-22 23:49 »
您好,

請問如有raid 卡的話, 不知 Seagate 那個系列的 SATA 可以考慮 ?

謝謝 ^^

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17484
    • 檢視個人資料
    • http://www.study-area.org
Re: [筆記]KVM效能調較
« 回覆 #5 於: 2015-03-23 08:26 »
硬體方面沒什麼研究呢,抱歉~

edwardleung

  • 俺是博士!
  • *****
  • 文章數: 1135
    • 檢視個人資料
Re: [筆記]KVM效能調較
« 回覆 #6 於: 2015-03-23 09:33 »
您好,

請問那款 ST500DM002 還在使用中? 有試過需要維修嗎?

謝謝 ^^