KVM相关操作
简介可以使用多种方式创建虚拟机,例如qemu,virt-manager等。本例使用virt-install创建Ubuntu14.04虚拟机demo。以demo虚拟机为例,通过virsh工具进行CPU扩容,内存扩容,网络桥接,内存优化,磁盘I/O优化测试等,通过这些方式,让读者掌握KVM虚拟机的日常管理操作。操作环境宿主机操作系统:Ubuntu14.04版本,4.2.0-27-generic内核,Q
简介
可以使用多种方式创建虚拟机,例如qemu,virt-manager等。本例使用virt-install创建Ubuntu14.04虚拟机demo。以demo虚拟机为例,通过virsh工具进行CPU扩容,内存扩容,网络桥接,内存优化,磁盘I/O优化测试等,通过这些方式,让读者掌握KVM虚拟机的日常管理操作。
操作环境
宿主机操作系统:Ubuntu14.04版本,4.2.0-27-generic内核,QEMU2.0.0版本,IP地址192.168.70.204。
虚拟机操作系统:Ubuntu14.04版本。
操作软件:
sudo apt-get install kvm
sudo apt-get install virt-manager
内容及步骤
1、VIRSH创建和管理虚拟机
(1) 在宿主机上,创建虚拟磁盘,-f指定格式,代码如下所示:
root@xjy-pc:/home/kvm# qemu-img create -f raw /home/kvm/ubuntu.raw 10G
Formatting '/home/kvm/ubuntu.raw', fmt=raw size=10737418240
(2) 使用virt-install(读者也可以通过其他方式创建虚拟机),通过步骤一中创建的虚拟磁盘,创建一台Ubuntu虚拟机,命名为demo,指定VNC端口号。如下所示:
root@xjy-pc:/home/kvm# virt-install --name demo --virt-type kvm --ram 1024 --cdrom /home/kvm/iso/ubuntu-14.04-desktop-amd64.iso --disk /home/kvm/ubuntu.raw --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
Starting install...
Creating domain... | 0 B 00:00
Domain installation still in progress. You can reconnect to the console to complete the installation process.
(3) 在另外一台Windows操作系统中,打开一个VNC客户端,输入服务器IP地址和VNC端口号(这里是192.168.70.204:5900),连接建立的KVM虚拟机,如图1所示。
(4) 将步骤二中的Ubuntu虚拟机逐步进行安装,图2为安装过程界面,安装完成后,图3所示为Ubuntu虚拟机启动后界面。
图2 Ubuntu14.04的安装界面
图3 Ubuntu14.04虚拟机
(5) 可以使用virsh list查看已经启动的虚拟机,如果未启动,使用命令“virsh start demo”进行启动,代码如下所示:
root@xjy-pc:/etc/libvirt/qemu# virsh list --all
Id Name State
----------------------------------------------------
- demo shut off
root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started
root@xjy-pc:/etc/libvirt/qemu# virsh list --all
Id Name State
----------------------------------------------------
12 demo running
(6) 可以使用“virsh shutdown demo”关闭demo虚拟机,使用“virsh destroy demo”强制关闭demo虚拟机电源。如下所示:
root@xjy-pc:/etc/libvirt/qemu# virsh list --all
Id Name State
----------------------------------------------------
12 demo running
root@xjy-pc:/etc/libvirt/qemu# virsh destroy demo
Domain demo destroyed
root@xjy-pc:/etc/libvirt/qemu# virsh list --all
Id Name State
----------------------------------------------------
- demo shut off
(7) KVM虚拟机配置文件默认位置为: /etc/libvirt/qemu/,可以通过配置文件定义并启动虚拟机,命令为:virsh create /etc/libvirt/qemu/demo.xml
(8) 通过virsh将内存中运行的虚拟机导出至虚拟机配置文件,命令为:# virsh dumpxml demo > /etc/libvirt/qemu/demo2.xml
,如图4所示。
图4 将虚拟机导出xml文件
(9) 通过“virsh edit demo”可以编辑KVM虚拟机配置文件,virsh edit将调用vi命令编辑/etc/libvirt/qemu/demo.xml配置文件。也可以直接通过vi命令进行编辑,修改,保存。
2、CPU扩容
(1) 使用“virsh edit”编辑虚拟机,为了实现CPU的热添加,就需要更改CPU的最大值,当然热添加值不能超过最大值。修改demo虚拟机的vcpu的配置当前为1,自动扩容,最大为4,代码如下:
root@xjy-pc:/etc/libvirt/qemu# virsh edit demo
<domain type='kvm'>
<name>demo</name>
<uuid>7ed0d5dd-d283-5390-9575-c1458db792fd</uuid>
<memory unit='KiB'>1048576</memory>
<currentMemory unit='KiB'>1048576</currentMemory>
<vcpu placement='auto' current='1'>4</vcpu>
<os>
<type arch='x86_64' machine='pc-i440fx-trusty'>hvm</type>
<boot dev='hd'/>
</os>
<features>
<acpi/>
……
(2) 关闭虚拟机demo,再次启动,并使用“virsh setvcpus”命令将demo热修改为2个cpu。
root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started
root@xjy-pc:/etc/libvirt/qemu# virsh setvcpus demo 2 --live
(3) 通过VNC登录KVM虚拟机,使用命令“grep processor /proc/cpuinfo |wc -l”查看是否扩容成功,如果结果为2,说明扩容成功。
3、内存扩容
(1) 内存的设置拥有一个气球(balloon)机制,可以增大也可以减少,但要设置一个最大值,默认并没有最大值,可以在安装时指定。
(2) 使用virsh edit编辑demo虚拟机的配置文件,标签表示最大内存。将图5中标签内容设置为4194304(4G),如图6所示。标签内容表示当前内存为1048576(1G)。
图5 demo虚拟机配置文件
图6 修改demo虚拟机配置文件
(3) 配置文件修改后,关闭虚拟机demo,再次启动。如下所示:
root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started
(4) demo虚拟机内存修改之前使用“virsh qemu-monitor-command”命令查看demo的当前内存。代码如下,“balloon: actual=1024”表示当前的内存为1024M,即1G。
root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd info balloon
balloon: actual=1024
(5) 将demo内存热修改为2097M,即2G。修改完毕后再次查看当前内存,代码如下:
root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd balloon 2097
root@xjy-pc:/etc/libvirt/qemu# virsh qemu-monitor-command demo --hmp --cmd info balloon
balloon: actual=2097
(6) 可以看出内存已经热修改为2G。
4、网络管理
(1) 在默认情况KVM的网络是NAT模式,但是在生产情况,用的多的都是网桥模式。
(2) 首先在宿主机上添加一个网桥br0,并查看网桥信息。使用命令“brctl”。代码如下:
root@xjy-pc:~# brctl addbr br0
root@xjy-pc:~# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.fe540048bd84 yes vnet0
(3) 网桥br0添加完毕后,查看br0的ip地址,代码如下:
root@xjy-pc:~# ifconfig br0
br0 Link encap:Ethernet HWaddr 26:f4:b6:0d:7a:7f
BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
(4) 接下来使用桥接模式把eth0加入网桥br0,让eth0成为br0的一个端口。同时将eth0接口ip删除,给br0设置ip为192.168.70.205,24位子网掩码。同时添加路由网关为192.168.70.2,并关闭防火墙,代码如下:(这个步骤会导致宿主机的网络断掉,之后重新通过bridge建立网络连接,所以建立bridge这个步骤不要通过SSH连接远程配置。)
root@xjy-pc:~# brctl addif br0 eth0 &&ip addr del dev eth0 192.168.70.204/24 && ifconfig br0 192.168.70.205/24 up && route add default gw 192.168.70.2&& iptables -F
(5) 再次查看网桥br0的ip地址,代码如下:
root@xjy-pc:~# ifconfig br0
br0 Link encap:Ethernet HWaddr 00:25:90:76:67:b5
inet addr:192.168.70.205 Bcast:192.168.70.255 Mask:255.255.255.0
inet6 addr: fe80::225:90ff:fe76:67b5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:528 errors:0 dropped:0 overruns:0 frame:0
TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:76041 (76.0 KB) TX bytes:15118 (15.1 KB)
(6) 使用virsh edit命令编辑虚拟机的网络配置,修改为使用br0网桥模式。
图7 demo虚拟机未修改前网络配置
图8 demo虚拟机修改后网络配置
(7) 将demo虚拟机关闭后重新启动,代码如下:
root@xjy-pc:/etc/libvirt/qemu# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/etc/libvirt/qemu# virsh start demo
Domain demo started
(8) 使用VNC连接demo虚拟机,在demo虚拟机中配置其静态IP地址为192.168.70.203后重启网卡。代码如下:
root@demo-pc:~# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 51:54:00:48:bd:84
inet addr:192.168.70.203 Bcast:192.168.70.255 Mask:255.255.255.0
inet6 addr: fe80::225:90ff:fe76:67b5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:208452 errors:0 dropped:219 overruns:0 frame:0
TX packets:702108 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:66675114 (66.6 MB) TX bytes:1010891428 (1.0 GB)
Interrupt:20 Memory:f7a00000-f7a20000
root@demo-pc:~# /etc/init.d/networking restart
(9) 在KVM服务器上使用ping命令测试与demo虚拟机的连通性,代码如下:
root@xjy-pc:~# ping 192.168.70.203 -c 5
PING 192.168.70.203 (192.168.70.203) 56(84) bytes of data.
64 bytes from 192.168.70.203: icmp_seq=1 ttl=64 time=0.265 ms
64 bytes from 192.168.70.203: icmp_seq=2 ttl=64 time=0.329 ms
64 bytes from 192.168.70.203: icmp_seq=3 ttl=64 time=0.225 ms
64 bytes from 192.168.70.203: icmp_seq=4 ttl=64 time=0.314 ms
64 bytes from 192.168.70.203: icmp_seq=5 ttl=64 time=0.303 ms
--- 192.168.70.203 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.225/0.287/0.329/0.039 ms
(10) 在demo虚拟机中使用ping命令测试与KVM服务器的连通性,代码如下:
root@demo-pc:~# ping 192.168.70.205 -c 5
PING 192.168.70.205 (192.168.70.205) 56(84) bytes of data.
64 bytes from 192.168.70.205: icmp_seq=1 ttl=64 time=0.181 ms
64 bytes from 192.168.70.205: icmp_seq=2 ttl=64 time=0.207 ms
64 bytes from 192.168.70.205: icmp_seq=3 ttl=64 time=0.329 ms
64 bytes from 192.168.70.205: icmp_seq=4 ttl=64 time=0.388 ms
64 bytes from 192.168.70.205: icmp_seq=5 ttl=64 time=0.248 ms
--- 192.168.70.205 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 3999ms
rtt min/avg/max/mdev = 0.181/0.288/0.388/0.064 ms
(11) 至此,虚拟机通过桥接模式和宿主机连通,和外界网络也保持了通畅。
5、内存优化
内存优化项通常包括EPT技术、透明大页和KSM技术几种。
EPT技术:
(1) EPT技术也叫扩展页表,这是Intel开创的硬件辅助内存虚拟化技术。内存的使用,是一个逻辑地址跟物理地址转换的过程。虚拟机内部有逻辑地址转换成物理地址的过程,然后虚拟机又要和宿主机内存进行逻辑到物理的转换过程,整个寻址过程有两次地址转换,效率非常低。而EPT技术,能将两次地址转换变成了一次,提高效率。这项技术基本上现在的服务器CPU都支持,只要在BIOS打开了Intel的VT设置,那么EPT也一起打开了。
(2) 使用图9中命令查看CPU是否支持EPT特性,使用图10中命令查看是否已开启EPT和VPID,Y表示已经加载了EPT和VPID,如果没加载可以通过命令“Modprobekvm _intel ept=0,vpid=0”加载。如图9和10所示:
图9 查看cpu是否支持EPT特性
图10 查看是否开启EPT特性
透明大页:
(1) 透明大页,也叫透明巨型页(Transparent Huge Page,THP),它允许所有的空余内存被用作缓存以提高性能,使用大页可以显著提高CPU的命中率,所以如果GuestOS使用大内存或者内存负载比较重的情况下,通过配置透明大页可以显著提高性能。这个设置在Ubuntu14.04中是默认开启的,不需要手动去操作。
(2) Ubuntu14.04支持透明大页,默认开启,如图11所示:
图11 透明大页默认开启
(3) 图11中的参数说明:
never :关闭。
always :尽量使用透明大页,扫描内存,有512个4k页面可以整合,就整合成一个2M的页面, 需要使用swap的时候,内存被分割为4k大小。
madvise :避免改变内存占用。
(4) 默认情况下,大页的数目为0,通过下面两种方式可以查看到,代码如下:
root@xjy-pc:~# cat /proc/sys/vm/nr_hugepages
0
root@xjy-pc:~# cat /proc/meminfo|grep HugePage
AnonHugePages: 376832 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
(5) 设置大页的数量为2000后,再次查看大页数目,此时系统有2000个可用大页,代码如下:
root@xjy-pc:~# echo 2000 > /proc/sys/vm/nr_hugepages
root@xjy-pc:~# cat /proc/sys/vm/nr_hugepages
2000
(6) 修改大页数量后查看虚拟机运行状态,发现即使虚拟机在运行,透明大页也没有被使用。
root@xjy-pc:~# virsh list --all
Id Name State
----------------------------------------------------
2 demo running
root@xjy-pc:~# cat /proc/meminfo|grep HugePage
AnonHugePages: 374784 kB
HugePages_Total: 2000
HugePages_Free: 2000
HugePages_Rsvd: 0
HugePages_Surp: 0
(7) 使用命令“virsh shutdown demo”将demo虚拟机关闭,然后修改demo虚拟机配置,添加使用大页的内容,(图12中可以看到demo虚拟机的内存为1G),在图12标签下面添加标签。如图12和13所示。
图12 demo虚拟机配置文件修改前
图13 demo虚拟机配置文件修改后
(8) 挂载大页,然后重新启动libvirtd-bin。
root@xjy-pc:/dev# mount -t hugetlbfs hutetlbfs /dev/hugepages
root@xjy-pc:/dev# mount|tail -l
……
hutetlbfs on /dev/hugepages type hugetlbfs (rw)
root@xjy-pc:/dev# /etc/init.d/libvirt-bin restart
* Restarting libvirt management daemon /usr/sbin/libvirtd
...done.
(9) 使用“virsh start demo”重新开启虚拟机后查看结果。从以下代码可以看出,共消耗了520个大页,每个大页默认大小为2M,正好是demo所有的内存。
root@xjy-pc:/dev# cat /proc/meminfo|grep -i HugePage
AnonHugePages: 34816 kB
HugePages_Total: 2000
HugePages_Free: 1480
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
(10) 如果关闭demo的话,所有大页将被释放,代码如下:
root@xjy-pc:/dev# virsh shutdown demo
Domain demo is being shutdown
root@xjy-pc:/dev# cat /proc/meminfo|grep -i HugePage
AnonHugePages: 34816 kB
HugePages_Total: 2000
HugePages_Free: 2000
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
(11) 另外,透明大页的开启使用命令“echo always >
/sys/kernel/mm/transparent_hugepage/enabled”,关闭使用“echo never >/sys/kernel/mm/transparent_hugepage/enabled”。
KSM技术:
(1) KSM(Kernel SamePage Merging),也叫相同页面内存压缩技术。KSM服务在Linux系统里默认是开启的,它的作用就是让内存利用的更加高效。内存是分页的,如果多个程序中用的内存都是相同的页面,那么KSM就会把相同的内存合并,这样就能腾出更多的空间。
(2) KSM在系统里有个守护进程ksmd,它的作用就是不断的扫描宿主机的内存情况,检测有相同的页面就会合并,当然这或多或少会消耗点CPU。查看ksmd进程代码如下:
root@xjy-pc:~# ps aux|grep ksmd|grep -v grep
root 68 0.4 0.0 0 0 ? SN 09:16 0:13 [ksmd]
(3) 如果宿主机的环境,内存资源比较丰富,建议这个功能不开启。如果不够,又想跑多一点的虚拟机,那么可以打开这个功能,但是一定要清楚,这个是一种内存超用的方案,假如大部分虚拟机内存变化比较频繁(比如内存使用率一下高,一下低),那么不建议开启,因为内存不够时,就会用到SWAP,那么KSM会严重影响虚拟机性能。
(4) 在宿主机KSM服务打开的情况下,如果不想让虚拟机受宿主机KSM的影响,可以进行如下操作:
编辑虚拟机的XML文件,添加:
<memoryBacking>
<nosharepages/>
</memoryBacking>
这样,KSM就不会去合并这个虚拟机的内存了
6、磁盘I/O优化
(1) I/O调度算法,也叫电梯算法。通常有Noop,Deadline和CFQ几种。Noop Scheduler是一个简单的FIFO队列,一个最简单的调度算法,由于会产生读I/O的阻塞,一般使用在SSD硬盘,此时不需要调度,I/O效果非常好。Deadline Scheduler是按照截止时间的调度算法,为了防止出现读取被饿死的现象,按照截止时间进行调整,默认的是读期限短于写期限,这样就不会产生饿死的状况。CFQ(Complete Fair Queueing Schedule)是完全公平的排队的I/O调度算法,保证每个进程相对特别公平的使用I/O。
(2) 查看宿主机Ubuntu14.04支持的调度算法,默认采用Deadline Scheduler,代码如下:
root@xjy-pc:/dev# dmesg|grep -i "scheduler"
[ 0.378025] io scheduler noop registered
[ 0.378027] io scheduler deadline registered (default)
[ 0.378048] io scheduler cfq registered
(3) 临时修改宿主机sda磁盘的I/O调度算法,将deadling修改为CFQ模式,代码如下:
root@xjy-pc:/dev# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq
root@xjy-pc:/dev# echo cfq > /sys/block/sda/queue/scheduler
root@xjy-pc:/dev# cat /sys/block/sda/queue/scheduler
noop deadline [cfq]
(4) 虚拟机的磁盘只不过是宿主机的一个文件,所以其I/O调度并无太大意义,反而会影响I/O效率,所以可以通过将客户机的I/O调度策略设置为NOOP来提高性能。NOOP就是一个FIFO队列,不做I/O调度。
更多推荐
所有评论(0)