KVM虚拟化 - cpu内存扩容、磁盘格式、网络桥接、性能优化
1、CPU动态扩容1.1、静态cpu扩容(需重启)# 直接修改vm虚拟机cpu参数[root@linux-node1 qemu]# vim /etc/libvirt/qemu/CentOS-7.1-x86_64.xml[root@linux-node1 qemu]# virsh edit CentOS-7.1-x86_64<vcpu placement='static'...
目录
1、CPU动态扩容
1.1、静态cpu扩容(需重启)
# 直接修改vm虚拟机cpu参数
[root@linux-node1 qemu]# vim /etc/libvirt/qemu/CentOS-7.1-x86_64.xml
[root@linux-node1 qemu]# virsh edit CentOS-7.1-x86_64
<vcpu placement='static'>1</vcpu> 修改为
<vcpu placement='auto' current='1'>4</vcpu> # 当前cpu为1,最大可配置为4
# 重启vm
[root@linux-node1 ~]# virsh destroy CentOS-7.1-x86_64
[root@linux-node1 ~]# virsh start CentOS-7.1-x86_64
[root@linux-node1 ~]# virsh dominfo CentOS-7.1-x86_64
CPU: 2
1.2、动态cpu扩容(热扩容)
# 注意:
# 动态扩容不得超过配置文件cpu最大数量
# 动态扩容只针对centos7生效,6不行
# 只能动态增加,不支持减少
# 直接修改vm虚拟机cpu参数
[root@linux-node1 qemu]# virsh edit CentOS-7.1-x86_64
<vcpu placement='static'>1</vcpu> 修改为
<vcpu placement='auto' current='1'>4</vcpu> # 当前cpu为1,最大可配置为4
# 直接使用setvcpus参数
[root@linux-node1 ~]# virsh setvcpus CentOS-7.1-x86_64 2 --live
[root@linux-node1 ~]# virsh dominfo CentOS-7.1-x86_64
Id: 4
名称: CentOS-7.1-x86_64
UUID: 2e66d4f3-96b4-43ad-9da1-b5007f110c23
OS 类型: hvm
状态: running
CPU: 2
CPU 时间: 70.0s
最大内存: 1048576 KiB
使用的内存: 1048576 KiB
持久: 是
自动启动: 启用
管理的保存: 否
安全性模式: none
安全性 DOI: 0
2、内存扩容
# 通过修改配置文件方式设置最大内存
root@test-kvm ~]# virsh dumpxml centos7 | grep -i memo
<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>2097152</currentMemory>
# 命令方式
[root@linux-node1 ~]# virsh setmem CentOS-7.1-x86_64 1748288
3、磁盘格式比较
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,但是不是立即占完的,用多少占多少
4、网络配置
# 启动kvm虚拟机,会多出一个vnet0网络设备,这是虚拟启动后生成的。
[root@linux-node1 ~]# ifconfig
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虚拟机流量桥接到virbr0上,然后经过宿主机的iptables的nat,再经过eth0出去,这就有网络瓶颈了,而且依靠iptables,如果你把iptables关闭无法上网了。同时ip地址是地址池中分配的内网地址。
# kvm获取的地址来源于下面
[root@linux-node1 ~]# 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@linux-node1 ~]# 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
# 生产中,网络这块改动如下:
一般是添加一个网络设备桥
把宿主机的网卡桥接到这上面
删除原先宿主机的IP地址
把宿主机的地址配置到这个网络设备桥上
最后修改kvm配置文件,让kvm也桥接到这个网络设备桥上
[root@linux-node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
virbr0 8000.5254002430ec yes virbr0-nic
vnet0
[root@linux-node1 ~]# brctl addbr br0
[root@linux-node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254002430ec yes virbr0-nic
vnet0
# 下面操作过程中会断网。我们可以写成脚本形式执行
[root@linux-node1 ~]# cd /tools
[root@linux-node1 ~]# vim edit-net.sh
[root@linux-node1 ~]# 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@linux-node1 ~]# sh edit-net.sh &
# 可以看到eth0上就没有ip地址了,同时eth0桥接到了br0上了
[root@linux-node1 ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c29a71724 no eth0
virbr0 8000.5254002430ec yes virbr0-nic
vnet0
[root@linux-node1 ~]# 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
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
# 把kvm也桥接到br0上
# interface这里原先配置如下
[root@linux-node1 ~]# virsh edit CentOS-7.1-x86_64
<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>
改成如下配置
<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地址已经重新获取到了
[root@linux-node1 ~]# 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
6、性能优化
https://blog.51cto.com/13871362/2350104
更多推荐
所有评论(0)