背景介紹
雲計算不等於虛擬化
虛擬化是技術
雲計算是資源使用交付模式
應用虛擬化:
比如你沒安裝xshell,但是你可以點這個xshell圖標,調用程序,這就是應用虛擬化的作用
應用虛擬化可能做好的xenapp
互聯網中服務器虛擬化應用最多。
另外網絡IO也是半虛擬化好
kvm支持超配(虛擬出多個cpu)
xen不支持超配,你買vps的時候,對方說它們是基於xen的。其實意思就是不是屬於超配的那種
學習基礎環境搭建可以參照這篇鏈接
http://www.cnblogs.com/nmap/p/6368157.html
kvm學習開始
先查看服務器cpu是否支持kvm虛擬機。有下面信息就表示支持了
[root@data-1-1 ~]# grep -E 'vmx|svm' /proc/cpuinfo flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss ht syscall nx rdtscp
lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc
aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx hypervisor lahf_lm ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust [root@data-1-1 ~]#
安裝kvm相關軟件包
virt-install包提供virt-install工具,可以用於創建虛擬機
qemu-kvm 主要的KVM程序包
virt-manager GUI虛擬機管理工具
libvirt 是可底層kvm內核打交道的接口工具。用戶態的所有命令都是調用了它。停止它,kvm運行正常,但是無法管理了
virt-install 基於libvirt服務的虛擬機創建命令
bridge-utils 創建和管理橋接設備的工具(安裝上述包會依賴此包。自動安裝上)
[root@data-1-1 ~]# yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.163.com * extras: mirrors.163.com * updates: mirrors.163.com Package 10:qemu-kvm-1.5.3-126.el7_3.3.x86_64 already installed and latest version Package 10:qemu-kvm-tools-1.5.3-126.el7_3.3.x86_64 already installed and latest version Package virt-manager-1.4.0-2.el7.noarch already installed and latest version Package libvirt-2.0.0-10.el7_3.4.x86_64 already installed and latest version Package virt-install-1.4.0-2.el7.noarch already installed and latest version Nothing to do [root@data-1-1 ~]#
安裝完畢通過下面命令都可以看到多出一個新的網絡設備virbr0
[root@data-1-1 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002430ec yes virbr0-nic [root@data-1-1 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.145.133 netmask 255.255.255.0 broadcast 192.168.145.255 inet6 fe80::20c:29ff:fea7:1724 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a7:17:24 txqueuelen 1000 (Ethernet) RX packets 165 bytes 27580 (26.9 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 148 bytes 23370 (22.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:24:30:ec txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@data-1-1 ~]#
啟動libvirtd服務,這個工具作用很大
設置libvirtd服務開機啟動,同時啟動此服務
[root@data-1-1 ~]# systemctl enable libvirtd.service [root@data-1-1 ~]# systemctl start libvirtd.service [root@data-1-1 ~]# systemctl status libvirtd.service
qemu-img工具
[root@data-1-1 ~]# whereis qemu-img qemu-img: /usr/bin/qemu-img /usr/share/man/man1/qemu-img.1.gz [root@data-1-1 ~]# rpm -qf /usr/bin/qemu-img qemu-img-1.5.3-126.el7_3.3.x86_64 [root@data-1-1 ~]#
使用qemu-img工具創建硬盤,格式,路徑,多大
[root@data-1-1 ~]# qemu-img create -f raw /opt/CentOS-7.1-x86_64.raw 10G Formatting '/opt/CentOS-7.1-x86_64.raw', fmt=raw size=10737418240 [root@data-1-1 ~]#
准備安裝kvm的系統源,這里使用iso的和宿主機的一致
[root@data-1-1 ~]# mkdir /tools [root@data-1-1 ~]# dd if=/dev/sr0 of=/tools/CentOS-7-x86_64-DVD-1503-01.iso 8419328+0 records in 8419328+0 records out 4310695936 bytes (4.3 GB) copied, 112.997 s, 38.1 MB/s [root@data-1-1 ~]#
關於virt-install在centos6里面virt-manager里面帶的,在centos7是需要單獨安裝virt-install安裝
virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 \ --cdrom=/tools/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7.1-x86_64.raw \ --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
執行過程如下
[root@data-1-1 ~]# virt-install --virt-type kvm --name CentOS-7-x86_64 --ram 2048 --cdrom=/tools/CentOS-7-x86_64-DVD-1503-01.iso --disk path=/opt/CentOS-7.1-x86_64.raw \
> --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole Starting install... Creating domain... | 0 B 00:00:00 Domain installation still in progress. You can reconnect to the console to complete the installation process. [root@data-1-1 ~]#
提前准備好vnc工具,連接過去
選中Install CentOS7 ,按tab鍵,輸入net.ifnames=0 biosdevname=0
下面的安裝步驟和宿主機的安裝基本一致。分區那里不用設置swap分區。本身就是虛擬機了,再設置swap分區,效果很差,比如阿里雲就沒設置swap分區
最后一步要注意,點擊reboot,它其實是關機。需要手動使用virsh命令啟動
virsh list可以查看虛擬機
[root@data-1-1 ~]# virsh list Id Name State ---------------------------------------------------- 3 CentOS-7-x86_64 running [root@data-1-1 ~]# virsh list Id Name State ---------------------------------------------------- [root@data-1-1 ~]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7-x86_64 shut off [root@data-1-1 ~]# virsh start CentOS-7-x86_64 Domain CentOS-7-x86_64 started [root@data-1-1 ~]# virsh list --all Id Name State ---------------------------------------------------- 4 CentOS-7-x86_64 running [root@data-1-1 ~]#
virsh常用命令
查看處於運行狀態的虛擬機
virsh list
查看宿主機上所有虛擬機(無論處於什么狀態,關機,掛起等)
virsh list --all
關閉虛擬機
virsh shudown CentOS-7-x86_64(主機名)
virsh destroy CentOS-7-x86_64(主機名) 類似kill -9 進程號
啟動虛擬機
virsh start CentOS-7-x86_64
刪除虛擬機
virsh undefine CentOS-7-x86_64
編輯虛擬機
virsh edit CentOS-7-x86_64
掛起虛擬機
virsh suspended CentOS-7-x86_64
恢復虛擬機
virsh resume CentOS-7-x86_64
查看正在運行的虛擬機:
ps -aux |grep kvm
kvm是以進程的方式運行的。也可以kill -9 殺掉這個虛擬機
假如停止了libvirt,虛擬機還在跑,但是你無法管理它了
libvirt對虛擬機不產生任何影響,只是用來管理的
[root@data-1-1 ~]# systemctl stop libvirtd [root@data-1-1 ~]# virsh list --all error: failed to connect to the hypervisor error: Failed to connect socket to '/var/run/libvirt/libvirt-sock': No such file or directory [root@data-1-1 ~]#
使用vncviewer登錄虛擬機
更改IP配置,去掉IPv6的配置,onboot改成yes,重啟網絡服務,更改resolv.conf,freedns改成no,可以ping通外網
出kvm機器安裝一些工具,比如ifconfig命令找不到可以安裝net-tools包,但是可以使用ip命令
yum install vim screen mtr nc nmap lrzsz openssl-devel gcc glibc gcc-c++ make zip dos2unix mysql sysstat wget rsync net-tools dstat setuptool system-config-* iptables ntsysv -y
在宿主機上查看,創建完kvm,下面路徑多了一個xml的文件,是虛擬機的配置文件
[root@data-1-1 ~]# cd /etc/libvirt/qemu [root@data-1-1 qemu]# ll total 4 -rw------- 1 root root 3844 Feb 6 18:48 CentOS-7-x86_64.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]# less CentOS-7-x86_64.xml [root@data-1-1 qemu]#
它定義了虛擬機的軟件和硬件信息,12行到13行定義了內存和cpu
[root@data-1-1 qemu]# cat CentOS-7-x86_64.xml <!-- WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit CentOS-7-x86_64 or other application using the libvirt API. --> <domain type='kvm'> <name>CentOS-7-x86_64</name> <uuid>702d4eed-7463-4ded-b8f8-a70a4f7164ce</uuid> <memory unit='KiB'>2097152</memory> <currentMemory unit='KiB'>2097152</currentMemory> <vcpu placement='static'>1</vcpu> <os> <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> </features> <cpu mode='custom' match='exact'> <model fallback='allow'>SandyBridge</model> </cpu> <clock offset='utc'> <timer name='rtc' tickpolicy='catchup'/> <timer name='pit' tickpolicy='delay'/> <timer name='hpet' present='no'/> </clock> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <pm> <suspend-to-mem enabled='no'/> <suspend-to-disk enabled='no'/> </pm> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/opt/CentOS-7.1-x86_64.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hda' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <controller type='usb' index='0' model='ich9-ehci1'> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x7'/> </controller> <controller type='usb' index='0' model='ich9-uhci1'> <master startport='0'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x0' multifunction='on'/> </controller> <controller type='usb' index='0' model='ich9-uhci2'> <master startport='2'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x1'/> </controller> <controller type='usb' index='0' model='ich9-uhci3'> <master startport='4'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x05' function='0x2'/> </controller> <controller type='pci' index='0' model='pci-root'/> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <controller type='virtio-serial' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </controller> <interface type='network'> <mac address='52:54:00:83:f7:a0'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <channel type='unix'> <target type='virtio' name='org.qemu.guest_agent.0'/> <address type='virtio-serial' controller='0' bus='0' port='1'/> </channel> <input type='tablet' bus='usb'> <address type='usb' bus='0' port='1'/> </input> <input type='mouse' bus='ps2'/> <input type='keyboard' bus='ps2'/> <graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'> <listen type='address' address='0.0.0.0'/> </graphics> <video> <model type='cirrus' vram='16384' heads='1' primary='yes'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/> </memballoon> </devices> </domain> [root@data-1-1 qemu]#
這里找出一些重要的說下,vnc的端口是-1 表示監聽再5900端口上
<graphics type='vnc' port='-1' autoport='yes' listen='0.0.0.0'>
這里是最大內存和當前內存,以及cpu數量
<memory unit='KiB'>2097152</memory> <currentMemory unit='KiB'>2097152</currentMemory> <vcpu placement='static'>1</vcpu>
下面是硬盤路徑和格式
<driver name='qemu' type='raw'/> <source file='/opt/CentOS-7.1-x86_64.raw'/>
hvm表示硬件虛擬化
<type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
文件開頭提示,你如果想編輯虛擬機配置,需要使用下面命令,不要直接修改這個文件
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE OVERWRITTEN AND LOST. Changes to this xml configuration should be made using: virsh edit CentOS-7-x86_64
libvirt的一些重要命令
virsh --help
dumpxml參數,如果你某天把這個虛擬機刪除了,通過xml文件還可以把它起來
這個參數可以導出xml文件
你要是物理刪除虛擬機,那就無法恢復了,這個xml文件類似一個靜態的saltstack描述文件
[root@data-1-1 qemu]# systemctl start libvirtd [root@data-1-1 qemu]# virsh list Id Name State ---------------------------------------------------- 4 CentOS-7-x86_64 running [root@data-1-1 qemu]# ll total 4 -rw------- 1 root root 3844 Feb 6 18:48 CentOS-7-x86_64.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]# virsh dumpxml CentOS-7-x86_64 >kvm1.xml [root@data-1-1 qemu]# ll total 12 -rw------- 1 root root 3844 Feb 6 18:48 CentOS-7-x86_64.xml -rw-r--r-- 1 root root 4740 Feb 6 22:54 kvm1.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]#
刪除虛擬機
刪除虛擬機的參數可以使用undefine ,它是徹底刪除的意思,如果沒有備份xml配置文件,那么虛擬機無法恢復了
[root@data-1-1 qemu]# virsh undefine CentOS-7-x86_64 Domain CentOS-7-x86_64 has been undefined [root@data-1-1 qemu]# ll total 8 -rw-r--r-- 1 root root 4740 Feb 6 22:54 kvm1.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]# virsh list Id Name State ---------------------------------------------------- 4 CentOS-7-x86_64 running [root@data-1-1 qemu]#
一旦關閉虛擬機,虛擬機就消失了
但是我們依然可以從虛擬機當前運行狀態備份它的配置文件
[root@data-1-1 qemu]# virsh list Id Name State ---------------------------------------------------- 4 CentOS-7-x86_64 running [root@data-1-1 qemu]# virsh dumpxml CentOS-7-x86_64 >kvm2.xml [root@data-1-1 qemu]# ll total 16 -rw-r--r-- 1 root root 4740 Feb 6 22:54 kvm1.xml -rw-r--r-- 1 root root 4740 Feb 6 22:57 kvm2.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]#
關閉kvm虛擬機。
[root@data-1-1 qemu]# virsh shutdown CentOS-7-x86_64 Domain CentOS-7-x86_64 is being shutdown [root@data-1-1 qemu]# virsh list --all Id Name State ---------------------------------------------------- [root@data-1-1 qemu]#
從備份的配置文件恢復虛擬機
[root@data-1-1 qemu]# virsh define kvm1.xml Domain CentOS-7-x86_64 defined from kvm1.xml [root@data-1-1 qemu]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7-x86_64 shut off [root@data-1-1 qemu]# virsh start CentOS-7-x86_64 Domain CentOS-7-x86_64 started [root@data-1-1 qemu]# virsh list --all Id Name State ---------------------------------------------------- 5 CentOS-7-x86_64 running [root@data-1-1 qemu]#
恢復之后,配置文件也出現了
[root@data-1-1 qemu]# ll total 20 -rw------- 1 root root 4001 Feb 6 23:00 CentOS-7-x86_64.xml -rw-r--r-- 1 root root 4740 Feb 6 22:54 kvm1.xml -rw-r--r-- 1 root root 4740 Feb 6 22:57 kvm2.xml drwx------. 3 root root 40 Feb 6 18:04 networks [root@data-1-1 qemu]#
關於快照功能部分
快照配置文件在/var/lib/libvirt/qemu/snapshot/虛擬機名稱/下,目前由於還沒做快照,目錄下沒任何東西
關於快照的命令參數可以查看下面
[root@data-1-1 qemu]# cd /var/lib/libvirt/qemu/snapshot/ [root@data-1-1 snapshot]# ll total 0 [root@data-1-1 snapshot]# virsh shutdown CentOS-7-x86_64 Domain CentOS-7-x86_64 is being shutdown [root@data-1-1 snapshot]# virsh list --all Id Name State ---------------------------------------------------- - CentOS-7-x86_64 shut off [root@data-1-1 snapshot]# virsh --help | grep snapshot iface-begin create a snapshot of current interfaces settings, which can be later committed (iface-commit) or restored (iface-rollback) Snapshot (help keyword 'snapshot') snapshot-create Create a snapshot from XML snapshot-create-as Create a snapshot from a set of args snapshot-current Get or set the current snapshot snapshot-delete Delete a domain snapshot snapshot-dumpxml Dump XML for a domain snapshot snapshot-edit edit XML for a snapshot snapshot-info snapshot information snapshot-list List snapshots for a domain snapshot-parent Get the name of the parent of a snapshot snapshot-revert Revert a domain to a snapshot [root@data-1-1 snapshot]#
raw磁盤格式的虛擬機不支持快照功能
[root@data-1-1 snapshot]# pwd /var/lib/libvirt/qemu/snapshot [root@data-1-1 snapshot]# ls [root@data-1-1 snapshot]# virsh snapshot-create CentOS-7-x86_64 error: unsupported configuration: internal snapshot for disk vda unsupported for storage type raw [root@data-1-1 snapshot]# cd /opt/ [root@data-1-1 opt]# ll total 2206412 -rw-r--r-- 1 root root 10737418240 Feb 6 23:07 CentOS-7.1-x86_64.raw [root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.raw image: CentOS-7.1-x86_64.raw file format: raw virtual size: 10G (10737418240 bytes) disk size: 2.1G [root@data-1-1 opt]#
好在我們可以轉換格式
轉換格式時虛擬機必須先關機
-f 源鏡像的格式
-O 目標鏡像的格式
轉換成qcow2格式的。可以看到它是保留了原來的文件
[root@data-1-1 opt]# qemu-img convert -f raw -O qcow2 CentOS-7.1-x86_64.raw CentOS-7.1-x86_64.qcow2 [root@data-1-1 opt]# ll total 4413264 -rw-r--r-- 1 root root 2259877888 Feb 6 23:15 CentOS-7.1-x86_64.qcow2 -rw-r--r-- 1 root root 10737418240 Feb 6 23:07 CentOS-7.1-x86_64.raw [root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.qcow2 image: CentOS-7.1-x86_64.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 2.1G cluster_size: 65536 Format specific information: compat: 1.1 lazy refcounts: false [root@data-1-1 opt]#
修改配置文件的disk模塊,把磁盤改成最新的qcow2的這個文件,同時格式也改成qcow2的
virsh edit CentOS-7-x86_64
<disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/opt/CentOS-7.1-x86_64.raw'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
修改成如下,type和source都改掉
<disk type='file' device='disk'> <driver name='qemu' type='qcow2'/> <source file='/opt/CentOS-7.1-x86_64.qcow2'/> <target dev='vda' bus='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> </disk>
開始做快照備份,如果不放心,可以先啟動kvm,沒問題后關閉再執行快照
看到下面路徑下出現了快照目錄和文件
[root@data-1-1 opt]# virsh snapshot-create CentOS-7-x86_64 Domain snapshot 1486394873 created [root@data-1-1 opt]# cd - /var/lib/libvirt/qemu/snapshot [root@data-1-1 snapshot]# pwd /var/lib/libvirt/qemu/snapshot [root@data-1-1 snapshot]# ls CentOS-7-x86_64 [root@data-1-1 snapshot]# cd CentOS-7-x86_64/ [root@data-1-1 CentOS-7-x86_64]# ls 1486394873.xml [root@data-1-1 CentOS-7-x86_64]#
查看快照,再次創建一個快照
[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list CentOS-7-x86_64 Name Creation Time State ------------------------------------------------------------ 1486394873 2017-02-06 23:27:53 +0800 shutoff [root@data-1-1 CentOS-7-x86_64]# virsh snapshot-create CentOS-7-x86_64 Domain snapshot 1486394993 created [root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list CentOS-7-x86_64 Name Creation Time State ------------------------------------------------------------ 1486394873 2017-02-06 23:27:53 +0800 shutoff 1486394993 2017-02-06 23:29:53 +0800 shutoff [root@data-1-1 CentOS-7-x86_64]# ll total 16 -rw------- 1 root root 4480 Feb 6 23:29 1486394873.xml -rw------- 1 root root 4531 Feb 6 23:29 1486394993.xml [root@data-1-1 CentOS-7-x86_64]#
查看當前快照,可以看到當前快照是1486394993,它上一級的快照是1486394873
[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-current CentOS-7-x86_64 <domainsnapshot> <name>1486394993</name> <state>shutoff</state> <parent> <name>1486394873</name> </parent>
恢復到某個版本的快照狀態
[root@data-1-1 CentOS-7-x86_64]# virsh snapshot-list CentOS-7-x86_64 Name Creation Time State ------------------------------------------------------------ 1486394873 2017-02-06 23:27:53 +0800 shutoff 1486394993 2017-02-06 23:29:53 +0800 shutoff [root@data-1-1 CentOS-7-x86_64]# virsh snapshot-revert CentOS-7-x86_64 1486394873 [root@data-1-1 CentOS-7-x86_64]# virsh snapshot-current CentOS-7-x86_64 <domainsnapshot> <name>1486394873</name> <state>shutoff</state>
還可以通過下面方式查看快照
[root@data-1-1 CentOS-7-x86_64]# cd /opt/ [root@data-1-1 opt]# ll total 4413396 -rw-r--r-- 1 root root 2260075008 Feb 6 23:32 CentOS-7.1-x86_64.qcow2 -rw-r--r-- 1 root root 10737418240 Feb 6 23:07 CentOS-7.1-x86_64.raw [root@data-1-1 opt]# qemu-img info CentOS-7.1-x86_64.qcow2 image: CentOS-7.1-x86_64.qcow2 file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 2.1G cluster_size: 65536 Snapshot list: ID TAG VM SIZE DATE VM CLOCK 1 1486394873 0 2017-02-06 23:27:53 00:00:00.000 2 1486394993 0 2017-02-06 23:29:53 00:00:00.000 Format specific information: compat: 1.1 lazy refcounts: false [root@data-1-1 opt]#
刪除某個快照
[root@data-1-1 opt]# virsh snapshot-delete CentOS-7-x86_64 1486394873 Domain snapshot 1486394873 deleted [root@data-1-1 opt]# virsh snapshot-list CentOS-7-x86_64 Name Creation Time State ------------------------------------------------------------ 1486394993 2017-02-06 23:29:53 +0800 shutoff [root@data-1-1 opt]#
CPU和內存動態擴容部分
[root@data-1-1 opt]# virt-install --help | grep cpu --vcpus VCPUS Number of vcpus to configure for your guest. Ex: --vcpus 5 --vcpus 5,maxcpus=10,cpuset=1-4,6,8 --vcpus sockets=2,cores=4,threads=2, --cpu CPU CPU model and features. Ex: --cpu coreduo,+x2apic --cpu host [root@data-1-1 opt]# virt-install --help | grep memory usage: virt-install --name NAME --memory MB STORAGE INSTALL [options] --memory MEMORY Configure guest memory allocation. Ex: --memory 1024 (in MiB) --memory 512,maxmemory=1024 --memtune MEMTUNE Tune memory policy for the domain process. --memorybacking MEMORYBACKING Set memory backing policy for the domain process. Ex: --memorybacking hugepages=on [root@data-1-1 opt]#
這里我們通過修改配置文件實現
首先需要修改支持動態更改cpu和內存
這里默認如下
<memory unit='KiB'>2097152</memory> <currentMemory unit='KiB'>2097152</currentMemory> <vcpu placement='static'>1</vcpu>
改成下面配置,主要改cpu這里
virsh edit CentOS-7-x86_64
<memory unit='KiB'>2097152</memory> <currentMemory unit='KiB'>2097152</currentMemory> <vcpu placement='auto' current='1'>4</vcpu>
重啟kvm虛擬機
動態修改cpu
查看cpu操作相關的參數,其中有一個setvcpus
[root@data-1-1 opt]# virsh --help | grep cpu cpu-baseline compute baseline CPU cpu-compare compare host CPU with a CPU described by an XML file cpu-stats show domain cpu statistics setvcpus change number of virtual CPUs vcpucount domain vcpu counts vcpuinfo detailed domain vcpu information vcpupin control or query domain vcpu affinity guestvcpus query or modify state of vcpu in the guest (via agent) cpu-models CPU models maxvcpus connection vcpu maximum nodecpumap node cpu map nodecpustats Prints cpu stats of the node. [root@data-1-1 opt]#
kvm虛擬機的cpu個數當前是1個
[root@data-1-1 opt]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Mon Feb 6 22:28:49 2017 from 192.168.122.1 [root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l 1 [root@localhost ~]#
修改成2個
[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live [root@data-1-1 opt]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Mon Feb 6 23:52:33 2017 from gateway [root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l 2 [root@localhost ~]#
動態修改cpu只有在CentOS7支持,CentOS6不支持
[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live [root@data-1-1 opt]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Mon Feb 6 23:52:33 2017 from gateway [root@localhost ~]# cat /proc/cpuinfo | grep processor | wc -l 2 [root@localhost ~]#
另外動態修改CPU,只能動態的添加,不能動態的減少,如果要減少可以通過關閉kvm,修改配置文件操作
動態修改的東西重啟失效
[root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 3 --live [root@data-1-1 opt]# virsh setvcpus CentOS-7-x86_64 2 --live error: unsupported configuration: failed to find appropriate hotpluggable vcpus to reach the desired target vcpu count [root@data-1-1 opt]#
另外,centos7版本的kvm修改后立即生效了
動態修改cpu只有centos7支持。centos6不支持
以前版本需要手動讓新加的cpu啟用
[root@data-1-1 ~]# virsh setvcpus CentOS-7-x86_64 2 --live [root@data-1-1 ~]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Tue Feb 7 00:09:34 2017 from gateway [root@localhost ~]# cat /sys/devices/system/cpu/cpu1/online 1 [root@localhost ~]#
也可以通過下面方式不登錄kvm虛擬機查看cpu個數
[root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep CPU CPU(s): 1 CPU time: 23.8s [root@data-1-1 ~]#
動態修改內存
[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 1512 [root@data-1-1 ~]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Tue Feb 7 00:10:45 2017 from gateway [root@localhost ~]# free -m total used free shared buff/cache available Mem: 1464 95 1248 8 121 1238 Swap: 0 0 0 [root@localhost ~]# exit logout Connection to 192.168.122.141 closed. [root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 600 [root@data-1-1 ~]# ssh root@192.168.122.141 root@192.168.122.141's password: Last login: Tue Feb 7 00:12:53 2017 from gateway [root@localhost ~]# free -m total used free shared buff/cache available Mem: 552 95 335 8 121 326 Swap: 0 0 0 [root@localhost ~]#
也可以不用登陸查看kvm內存
[root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 800 [root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep memory Max memory: 2097152 KiB Used memory: 819200 KiB [root@data-1-1 ~]# virsh qemu-monitor-command CentOS-7-x86_64 --hmp --cmd balloon 1800 [root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep memory Max memory: 2097152 KiB Used memory: 1843200 KiB [root@data-1-1 ~]#
另一種修改kvm內存的方式,另外修改內存不能超過最大內存
[root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 748288 [root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep memory Max memory: 2097152 KiB Used memory: 748288 KiB [root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 1748288 [root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep memory Max memory: 2097152 KiB Used memory: 1748288 KiB [root@data-1-1 ~]# virsh setmem CentOS-7-x86_64 2748288 error: invalid argument: cannot set memory higher than max memory [root@data-1-1 ~]# virsh dominfo CentOS-7-x86_64 | grep memory Max memory: 2097152 KiB Used memory: 1748288 KiB [root@data-1-1 ~]#
在規划是考慮到想要熱添加,當時裝虛擬機的時候,就要考慮這個問題,設置max內存和cpu
關於硬盤擴容部分,雖然可以resize增大,但是有丟失數據的風險,生產中不推薦使用
幾種磁盤格式比較
1. raw
raw格式是最簡單,什么都沒有,所以叫raw格式。連頭文件都沒有,就是一個直接給虛擬機進行讀寫的文件。raw不支持動態增長空間,必須一開始就指定空間大小。所以相當的耗費磁盤空間。但是對於支持稀疏文件的文件系統(如ext4)而言,這方面並不突出。ext4下默認創建的文件就是稀疏文件,所以不要做什么額外的工作。用
du -sh 文件名
可以查看文件的實際大小。也就是說,不管磁盤空間有多大,運行下面的指令沒有任何問題:
qemu-img create -f raw test.img 10000G
raw鏡像格式是虛擬機種I/O性能最好的一種格式,大家在使用時都會和raw進行參照,性能越接近raw的越好。但是raw沒有任何其他功能。對於稀疏文件的出現,像qcow這一類的運行時分配空間的鏡像就沒有任何優勢了。
2. cow
cow格式和raw一樣簡單,也是創建時分配所有空間,但cow有一個bitmap表記錄當前哪些扇區被使用,所以cow可以使用增量鏡像,也就是說可以對其做外部快照。但cow也沒有其他功能,其特點就是簡單。
3. qcow
qcow在cow的基礎上增加了動態增加文件大小的功能,並且支持加密,壓縮。qcow通過2級索引表來管理整個鏡像的空間分配,其中第二級的索引用了內存cache技術,需要查找動作,這方面導致性能的損失。qcow現在基本不用,一方面其優化和功能沒有qcow2好,另一方面,讀寫性能又沒有cow和raw好。
4. qcow2
qcow2是集各種技術為一體的超級鏡像格式,支持內部快照,加密,壓縮等一系列功能,訪問性能也在不斷提高。但qcow2的問題就是過於臃腫,把什么功能都集於一身。鏡像小的原因是鏡像文件只保存改變的部分,原來的文件被鎖住了。
qcow2格式,類似虛擬機的瘦模式,雖然划分10GB,但是不是立即占完的,用多少占多少
另外
假如你有幾百GB的數據,不建議放在kvm里面,
IO慢,kvm遷移也麻煩
KVM的網絡部分
啟動kvm虛擬機,會多出一個vnet0網絡設備,這是虛擬啟動后生成的。
[root@data-1-1 ~]# ifconfig eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.145.133 netmask 255.255.255.0 broadcast 192.168.145.255 inet6 fe80::20c:29ff:fea7:1724 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a7:17:24 txqueuelen 1000 (Ethernet) RX packets 289558 bytes 327309816 (312.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 86615 bytes 17569530 (16.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 1844 (1.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 1844 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:24:30:ec txqueuelen 0 (Ethernet) RX packets 45935 bytes 4046581 (3.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 84374 bytes 315862341 (301.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::fc54:ff:fe83:f7a0 prefixlen 64 scopeid 0x20<link> ether fe:54:00:83:f7:a0 txqueuelen 500 (Ethernet) RX packets 464 bytes 49210 (48.0 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1356 bytes 104195 (101.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
kvm虛擬機啟動后,vnet0默認橋接到了virbr0上,關閉后消失
[root@data-1-1 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002430ec yes virbr0-nic vnet0 [root@data-1-1 ~]# virsh shutdown CentOS-7-x86_64 Domain CentOS-7-x86_64 is being shutdown [root@data-1-1 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002430ec yes virbr0-nic [root@data-1-1 ~]#
此時的kvm虛擬機出去的流量是警告橋接到virbr0上,然后經過宿主機的iptables的nat,再經過eth0出去
這就有網絡瓶頸了,而且依靠iptables,如果你把iptables關閉無法上網了。同時ip地址是地址池中分配的內網地址
[root@data-1-1 ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 203 packets, 16415 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 34 packets, 6320 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 24 packets, 4644 bytes) pkts bytes target prot opt in out source destination Chain POSTROUTING (policy ACCEPT 24 packets, 4644 bytes) pkts bytes target prot opt in out source destination 0 0 RETURN all -- * * 192.168.122.0/24 224.0.0.0/24 0 0 RETURN all -- * * 192.168.122.0/24 255.255.255.255 0 0 MASQUERADE tcp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 169 10095 MASQUERADE udp -- * * 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535 0 0 MASQUERADE all -- * * 192.168.122.0/24 !192.168.122.0/24 [root@data-1-1 ~]#
kvm獲取的地址來源於下面
[root@data-1-1 ~]# ps aux | grep dns nobody 1343 0.0 0.0 15544 964 ? S Feb06 0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 1344 0.0 0.0 15516 300 ? S Feb06 0:00 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper root 7701 0.0 0.0 112648 968 pts/0 S+ 00:36 0:00 grep --colour=auto dns [root@data-1-1 ~]# cat /var/lib/libvirt/dnsmasq/default.conf ##WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE ##OVERWRITTEN AND LOST. Changes to this configuration should be made using: ## virsh net-edit default ## or other application using the libvirt API. ## ## dnsmasq conf file created by libvirt strict-order pid-file=/var/run/libvirt/network/default.pid except-interface=lo bind-dynamic interface=virbr0 dhcp-range=192.168.122.2,192.168.122.254 dhcp-no-override dhcp-lease-max=253 dhcp-hostsfile=/var/lib/libvirt/dnsmasq/default.hostsfile addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts [root@data-1-1 ~]#
生產中,網絡這塊改動如下:
一般是添加一個網絡設備橋
把宿主機的網卡橋接到這上面
刪除原先宿主機的IP地址
把宿主機的地址配置到這個網絡設備橋上
最后修改kvm配置文件,讓kvm也橋接到這個網絡設備橋上
[root@data-1-1 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002430ec yes virbr0-nic vnet0 [root@data-1-1 ~]# brctl addbr br0 [root@data-1-1 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000000000000 no virbr0 8000.5254002430ec yes virbr0-nic vnet0
下面操作過程中會斷網。我們可以寫成腳本形式執行
操作如下
[root@data-1-1 ~]# cd /tools [root@data-1-1 tools]# vim edit-net.sh [root@data-1-1 tools]# cat edit-net.sh brctl addif br0 eth0 ip addr del dev eth0 192.168.145.133/24 ifconfig br0 192.168.145.133/24 up route add default gw 192.168.145.2 [root@data-1-1 tools]# sh edit-net.sh & [1] 8311 [root@data-1-1 tools]# [1]+ Done sh edit-net.sh [root@data-1-1 tools]#
可以看到eth0上就沒有ip地址了,同時eth0橋接到了br0上了
[root@data-1-1 tools]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29a71724 no eth0 virbr0 8000.5254002430ec yes virbr0-nic vnet0 [root@data-1-1 tools]# ifconfig br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.145.133 netmask 255.255.255.0 broadcast 192.168.145.255 inet6 fe80::20c:29ff:fea7:1724 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a7:17:24 txqueuelen 0 (Ethernet) RX packets 38 bytes 2676 (2.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 35 bytes 3654 (3.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::20c:29ff:fea7:1724 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:a7:17:24 txqueuelen 1000 (Ethernet) RX packets 293183 bytes 327693627 (312.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 89134 bytes 18395706 (17.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 0 (Local Loopback) RX packets 4 bytes 1844 (1.8 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 4 bytes 1844 (1.8 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:24:30:ec txqueuelen 0 (Ethernet) RX packets 46059 bytes 4057533 (3.8 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 84485 bytes 315875854 (301.2 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vnet0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::fc54:ff:fe83:f7a0 prefixlen 64 scopeid 0x20<link> ether fe:54:00:83:f7:a0 txqueuelen 500 (Ethernet) RX packets 12 bytes 1162 (1.1 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 737 bytes 38921 (38.0 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@data-1-1 tools]#
把kvm也橋接到br0上
interface這里原先配置如下
<interface type='network'> <mac address='52:54:00:83:f7:a0'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
改成如下配置
virsh edit CentOS-7-x86_64
<interface type='bridge'> <mac address='52:54:00:83:f7:a0'/> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
重啟kvm,使用vnc登錄,看到ip地址已經重新獲取到了
可以修改網卡配置文件改成靜態地址
此時已經可以使用xshell從筆記本登錄此kvm機器了
[root@localhost ~]# ip ad 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 52:54:00:83:f7:a0 brd ff:ff:ff:ff:ff:ff inet 192.168.145.134/24 brd 192.168.145.255 scope global dynamic eth0 valid_lft 1643sec preferred_lft 1643sec inet6 fe80::5054:ff:fe83:f7a0/64 scope link valid_lft forever preferred_lft forever [root@localhost ~]#
esxi默認就是橋接的,,沒這么復雜
kvm這里復雜,所以靈活
KVM的優化部分
3個方面,cpu、內存、IO,優化點不多,介紹下相關概念
cpu的優化部分
ring0內核態,級別高,可以直接操作硬件
ring0,用戶態,級別低,無法直接操作硬件,如想寫硬盤,切換到內核態執行
這是一種上下文切換
客戶機不知道自己是否工作在內核態
vt-x,可以幫你進行上下文切換,加速上下文切換
kvm是個進程,需要被cpu調度,cpu有緩存,為了訪問速度更快
kvm可以被調度到任何cpu上執行
這個kvm這時候在cpu1上運行,有了緩存
下一刻跑到了cpu2上執行,這就是cache miss
把kvm綁定到某個cpu上,命中率就搞了,提供性能
taskset綁定進程到某個或者某幾個cpu上
綁定之后,性能能提高不到10%
一般一個cpu多核心,它們的緩存是共享的
[root@data-1-1 ~]# taskset --help Usage: taskset [options] [mask | cpu-list] [pid|cmd [args...]] Options: -a, --all-tasks operate on all the tasks (threads) for a given pid -p, --pid operate on existing given pid -c, --cpu-list display and specify cpus in list format -h, --help display this help -V, --version output version information The default behavior is to run a new command: taskset 03 sshd -b 1024 You can retrieve the mask of an existing task: taskset -p 700 Or set it: taskset -p 03 700 List format uses a comma-separated list instead of a mask: taskset -pc 0,3,7-11 700 Ranges in list format can take a stride argument: e.g. 0-31:2 is equivalent to mask 0x55555555 For more information see taskset(1). [root@data-1-1 ~]#
使用ps aux | grep kvm命令查看到當前kvm虛擬機進程號是8598,我把它綁定到1號cpu上運行
[root@data-1-1 ~]# taskset -cp 1 8598 pid 8598's current affinity list: 0-3 pid 8598's new affinity list: 1 [root@data-1-1 ~]#
把它綁定到1號和2號運行,讓它只能在這兩個cpu之間運行
[root@data-1-1 ~]# taskset -cp 1,2 8598 pid 8598's current affinity list: 1 pid 8598's new affinity list: 1,2 [root@data-1-1 ~]#
內存優化
1、宿主機bios打開EPT功能,加快地址映射
2、宿主機系統配置大頁內存,這樣尋址快一點(使用大頁內存虛擬機性能提高10%以上)
3、打開內存合並
EPT為了提升虛擬化內存映射的效率而提供的一項技術。
打開EPT后,GuestOS運行時,通過頁表轉化出來的地址不再是真實的物理地址,而是被稱作為guest-physical addresses,經過EPT的轉化后才成為真實的物理地址。
可以使用 $cat /proc/cpuinfo | grep ept檢查硬件是否支持ept機制。如果支持那么kvm會自動的利用EPT。
intel開發的ept技術加快地址映射。bios打開這個功能就行
現在宿主機的是進行內存的合並。把連續的內存合並為2MB的大頁內存
減少內存碎片
[root@data-1-1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never [root@data-1-1 ~]#
大頁內存,這里默認是2MB
[root@data-1-1 ~]# cat /proc/meminfo | tail -10 VmallocChunk: 34359451736 kB HardwareCorrupted: 0 kB AnonHugePages: 362496 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 85824 kB DirectMap2M: 4108288 kB [root@data-1-1 ~]#
IO的優化
關於IO緩存模式的優化
參照下面博文,版權歸原作者所有。
http://blog.chinaunix.net/uid-20940095-id-3371268.html
2. kvm 存儲棧的原理
從上圖的storage stack中可以看出有些模塊都是double的,比如:
(1)兩層file system: guest file system 和 host file system
(2)兩層的page cache:guest和host中分別有針對文件的page cache
(3)兩層的IO scheduler
鑒於這么多的冗余結構,因此,可以采用適當的優化來提高io的性能。主要的優化方法包括:
(1)采用virtio驅動代替ide驅動,目前kvm使用的就是virtio
(2)禁用host層的page cache
(3)開啟huge page,開啟大頁內存
(4)禁用ksm
virtio半虛擬化I/O設備框架,標准化guest與host之間數據交換接口,簡化流程,減少內存拷貝,提升虛擬機I/O效率
3. host層對kvm image文件io的cache方式
kvm通過三個參數來制定host對image文件的io cache方式:none,writeback和writethrough,下圖詳細的闡述了三種不同的cache方式的區別
從圖中可以清晰的看到,writeback采用了guest和host兩層的page cache,也就是說同一個文件會存在兩份cache,這基本是沒有必要的。
none和writethrough都會繞過host層的page cache。kvm默認的cache方式是writethrouh,這種方式不會是最安全的,不會造成數據的不一致性,但是性能也是最差的。綜合數據的安全性和性能,建議選擇none模式。
但是,隨着barrier passing技術的出現,writeback也能保證數據的一致性,所以,如果采用raw格式的image,建議選擇none,如果采用qcow2格式的image,建議選擇writeback。
詳細了解也可以參照下面博文
http://blog.sina.com.cn/s/blog_5ff8e88e0101bjmb.html
http://chuansong.me/n/2187028
關於IO的調度算法的優化
如果你的磁盤是ssd的話,一定要設置noop
noop就是為了緩存,閃存設備配置的
現在有3種,在centos7默認是deadline
[root@data-1-1 ~]# cat /sys/block/sda/queue/scheduler noop [deadline] cfq [root@data-1-1 ~]#
可以通過下面方式修改的調度算法
[root@data-1-1 ~]# echo noop > /sys/block/sda/queue/scheduler [root@data-1-1 ~]# cat /sys/block/sda/queue/scheduler [noop] deadline cfq [root@data-1-1 ~]# echo deadline > /sys/block/sda/queue/scheduler [root@data-1-1 ~]# cat /sys/block/sda/queue/scheduler
deadline算法
centos7默認的算法
讀多寫少,對數據庫支持好,但是只要使用ssd,設置為noop即可
深入了解調度算法,可以參照下面博文
http://www.cnblogs.com/kongzhongqijing/articles/5786002.html
結尾部分
修改橋接為永久生效的,上述橋接操作,讓宿主機的eth0橋接到br0上是臨時生效的,加入重啟宿主機,就失效了。
之前使用的brctl命令來自於下面包
[root@data-1-1 network-scripts]# which brctl /usr/sbin/brctl [root@data-1-1 network-scripts]# rpm -qf /usr/sbin/brctl bridge-utils-1.5-9.el7.x86_64 [root@data-1-1 network-scripts]#
創建了一個ifcfg-br0文件,然后更改eth0的配置文件,橋接上去
我如下修改之后,重啟network服務,發現無法登錄,ip ad看到ip地址沒生效,重啟機器才可以連接,再次遠程登錄,重啟network服務沒出現過連接不上的情況,后面需要留意下
下面是改動的地方配置情況
[root@data-1-1 network-scripts]# rpm -qf /usr/sbin/brctl bridge-utils-1.5-9.el7.x86_64 [root@data-1-1 network-scripts]# pwd /etc/sysconfig/network-scripts [root@data-1-1 network-scripts]# cat ifcfg-eth0 TYPE=Ethernet NAME=eth0 DEVICE=eth0 ONBOOT=yes BRIDGE=br0 [root@data-1-1 network-scripts]# cat ifcfg-br0 TYPE=Bridge BOOTPROTO=static DEVICE=br0 ONBOOT=yes IPADDR=192.168.145.133 NETMASK=255.255.255.0 GATEWAY=192.168.145.2 NAME=br0 [root@data-1-1 network-scripts]#
關於網卡橋接
[root@data-1-1 network-scripts]# virsh start CentOS-7-x86_64 Domain CentOS-7-x86_64 started [root@data-1-1 network-scripts]# brctl show bridge name bridge id STP enabled interfaces br0 8000.000c29a71724 no eth0 vnet0 virbr0 8000.5254002430ec yes virbr0-nic [root@data-1-1 network-scripts]#
知識補充
1、kvm的autostart,設置虛擬機隨着宿主機開機啟動的方法
[root@data-1-1 network-scripts]# virsh list Id Name State ---------------------------------------------------- 1 CentOS-7-x86_64 running [root@data-1-1 network-scripts]# virsh autostart CentOS-7-x86_64 Domain CentOS-7-x86_64 marked as autostarted [root@data-1-1 network-scripts]#