半虚拟化驱动
host:宿主机(物理机),guest:客户机(虚拟机)
1.使用virtio驱动
linux中的virtio驱动
linux内核一般都自带virtio模块
内核配置文件与virtio相关配置
[root@desktop0 ~]# grep VIRTIO_ /boot/config-3.10.0-123.el7.x86_64
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=m
# CONFIG_VIRTIO_MMIO is not set
[root@desktop0 ~]#
查看virtio驱动
[root@foundation0 p_w_picpaths]# find/lib/modules/3.10.0-123.el7.x86_64/ -name "virtio*.ko"
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/block/virtio_blk.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/char/hw_random/virtio-rng.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/char/virtio_console.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/net/virtio_net.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/scsi/virtio_scsi.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/virtio/virtio.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/virtio/virtio_balloon.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/virtio/virtio_pci.ko
/lib/modules/3.10.0-123.el7.x86_64/kernel/drivers/virtio/virtio_ring.ko
[root@foundation0 p_w_picpaths]#
查看已加载的virtio模块
[root@desktop0 ~]# lsmod |grep virtio
virtio_balloon 13530 0
virtio_blk 18329 2
virtio_net 28059 0
virtio_pci 17725 0
virtio_ring 21011 4virtio_blk,virtio_net,virtio_pci,virtio_balloon
virtio 14187 4virtio_blk,virtio_net,virtio_pci,virtio_balloon
windows中的virtio驱动没写完
[root@foundation0 /]# yum -y installvirto-win
Loaded plugins: langpacks, product-id,subscription-manager
This system is not registered to Red HatSubscription Management. You can use subscription-manager to register.
rhel-dvd | 4.1 kB 00:00
rht-ext | 2.9 kB 00:00
No package virto-win available.
Error: Nothing to do
[root@foundation0 /]# rpm -q virtio-win
package virtio-win is not installed
[root@foundation0 /]# ls/usr/share/virt-win/
ls: cannot access /usr/share/virt-win/: Nosuch file or directory
2.virtio_balloon
ballooning:内存的ballooning(气球)技术可以在guest运行时动态地调整它所占用的host内存资源,不需要关机。但需要手动调整。
如下图,正方形里的内存是guest的,ballooning技术形象地在guest占用的内存中引入气球(balloon)概念,气球中的内存可供host使用(不能被guest访问或使用)。
当guest空闲,但host内存不够时,气球膨胀,将guest内存分给host.
当guest繁忙,host空闲时,气球放气变小,将气球里的内存还给guest.
查看balloon设备
[root@desktop0 ~]# lspci
00:00.0 Host bridge: Intel Corporation440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Red Hat,Inc. QXL paravirtual graphic card (rev 04)
00:03.0 Ethernet controller: Red Hat, IncVirtio network device
00:04.0 Ethernet controller: Red Hat, IncVirtio network device
00:05.0 Ethernet controller: Red Hat, IncVirtio network device
00:06.0 SCSI storage controller: Red Hat,Inc Virtio block device
00:07.0 SCSI storage controller: Red Hat,Inc Virtio block device
00:08.0Unclassified device [00ff]: Red Hat, Inc Virtio memory balloon
[root@desktop0 ~]#
[root@desktop0~]# lsmod |grep virtio
virtio_balloon 13530 0
virtio_blk 18329 2
virtio_net 28059 0
virtio_pci 17725 0
virtio_ring 21011 4 virtio_blk,virtio_net,virtio_pci,virtio_balloon
virtio 14187 4 virtio_blk,virtio_net,virtio_pci,virtio_balloon
[root@desktop0 ~]#
[root@desktop0~]# lspci -s 00:08.0 -v
00:08.0 Unclassified device [00ff]: RedHat, Inc Virtio memory balloon
Subsystem:Red Hat, Inc Device 0005
PhysicalSlot: 8
Flags:bus master, fast devsel, latency 0, IRQ 11
I/Oports at c120 [size=32]
Kernel driver in use: virtio-pci
[root@desktop0~]#
查看内存使用情况
[root@desktop0~]# free -m
total used free shared buffers cached
Mem: 1841 704 1137 16 0 286
-/+ buffers/cache: 416 1424
Swap: 0 0 0
[root@desktop0 ~]#
下面将内存设置为1024M
[root@desktop0 ~]# free -m
total used free shared buffers cached
Mem: 817 703 113 16 0 286
-/+ buffers/cache: 416 400
Swap: 0 0 0
[root@desktop0 ~]#
3.virtio_net
使用virtio_net半虚拟化驱动,可以提高网络吞吐量和降低网络延迟,使guest拥有和host一样的原生网卡网络性能。
在guest中查看virtio网卡使用情况
[root@desktop0 ~]# grep VIRTIO_ /boot/config-3.10.0-123.el7.x86_64
CONFIG_VIRTIO_BLK=m
CONFIG_VIRTIO_NET=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_BALLOON=m
# CONFIG_VIRTIO_MMIO is not set
[root@desktop0 ~]#
[root@desktop0 ~]# lspci
00:00.0 Host bridge: Intel Corporation440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation82371SB PIIX3 ISA [Natoma/Triton II]
00:01.1 IDE interface: Intel Corporation82371SB PIIX3 IDE [Natoma/Triton II]
00:01.2 USB controller: Intel Corporation82371SB PIIX3 USB [Natoma/Triton II] (rev 01)
00:01.3 Bridge: Intel Corporation82371AB/EB/MB PIIX4 ACPI (rev 03)
00:02.0 VGA compatible controller: Red Hat,Inc. QXL paravirtual graphic card (rev 04)
00:03.0Ethernet controller: Red Hat, Inc Virtio network device
00:04.0Ethernet controller: Red Hat, Inc Virtio network device
00:05.0Ethernet controller: Red Hat, Inc Virtio network device
[root@desktop0~]# lspci -vv -s 00:03.0
00:03.0 Ethernet controller: Red Hat, IncVirtio network device
Subsystem:Red Hat, Inc Device 0001
PhysicalSlot: 3
Control:I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR+FastB2B- DisINTx+
Status:Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- Latency:0 Interrupt:pin A routed to IRQ 10 Region0: I/O ports at c0c0 [size=32] Region1: Memory at fc0d2000 (32-bit, non-prefetchable) [size=4K] ExpansionROM at fc000000 [disabled] [size=256K] Capabilities:[ [root@desktop0 ~]# lsmod |grep virtio virtio_balloon 13530 0 virtio_blk 18329 2 virtio_net 28059 0 [root@desktop0~]# [root@desktop0~]# ethtool -i eth0 driver:virtio_net version: 1.0.0 firmware-version: bus-info: 0000:00:03.0 supports-statistics: no supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no [root@desktop0~]# ifconfig eth0 eth0: flags=4163 inet 172.25.0.10 netmask 255.255.255.0 broadcast 172.25.0.255 [root@desktop0~]# ping 172.25.0.250 -c 1 PING 172.25.0.250 (172.25.0.250) 56(84)bytes of data. 64bytes from 172.25.0.250: icmp_seq=1 ttl=64 time=0.304 ms --- 172.25.0.250 ping statistics --- 1 packets transmitted, 1 received, 0%packet loss, time 0ms rtt min/avg/max/mdev =0.304/0.304/0.304/0.000 ms [root@desktop0 ~]# host闭关TSO与GSO,可使半虚拟化网络驱动的性能更加优化,其中eno16777736是建立bridge供guest使用的网络接口 [root@foundation0p_w_picpaths]# ethtool -k eno16777736 Features for eno16777736: rx-checksumming: off tx-checksumming: on tx-checksum-ipv4:off [fixed] tx-checksum-ip-generic:on tx-checksum-ipv6:off [fixed] tx-checksum-fcoe-crc:off [fixed] tx-checksum-sctp:off [fixed] scatter-gather: on tx-scatter-gather:on tx-scatter-gather-fraglist:off [fixed] tcp-segmentation-offload:on tx-tcp-segmentation:on tx-tcp-ecn-segmentation:off [fixed] tx-tcp6-segmentation:off [fixed] udp-fragmentation-offload: off [fixed] generic-segmentation-offload:on [root@foundation0p_w_picpaths]# ethtool -K eno16777736 gso off [root@foundation0p_w_picpaths]# ethtool -K eno16777736 tso off [root@foundation0p_w_picpaths]# ethtool -k eno16777736 Features for eno16777736: rx-checksumming: off tx-checksumming: on tx-checksum-ipv4:off [fixed] tx-checksum-ip-generic:on tx-checksum-ipv6:off [fixed] tx-checksum-fcoe-crc:off [fixed] tx-checksum-sctp:off [fixed] scatter-gather: on tx-scatter-gather:on tx-scatter-gather-fraglist:off [fixed] tcp-segmentation-offload:off tx-tcp-segmentation:off tx-tcp-ecn-segmentation:off [fixed] tx-tcp6-segmentation:off [fixed] udp-fragmentation-offload: off [fixed] generic-segmentation-offload:off vhost-net后端驱动 后端驱动一般是由qemu提供的,如果对于网络IO请求的后端处理能够在内核空间来完成,效率就会更高,提高网络吞吐与减少延迟,在较新的内核中有一个叫“vhost-net”的驱动模块,作为一个内核级别的后端处理程序,将virtio-net的后端处理任务放到内核空间中执行,以提高效率。 如果guest处理数据的速度比host发送的速度慢,则不使用vhost-net,让传输速度稍微慢一点反而会提高整体的性能。容易造成缓冲区溢出。 下面查看vhost-net的使用情况 [root@foundation0p_w_picpaths]# grep VHOST /boot/config-3.10.0-123.el7.x86_64 CONFIG_VHOST_NET=m # CONFIG_VHOST_SCSI is not set CONFIG_VHOST_RING=m [root@foundation0p_w_picpaths]# lsmod |grep vhost vhost_net 33961 8 macvtap 18302 1 vhost_net tun 27183 17 vhost_net host中的内核将vhost-net编译为模块 [root@foundation0p_w_picpaths]# rmmod vhost-net rmmod: ERROR: Module vhost_net is in use [root@foundation0 p_w_picpaths]# 在使用libvirt时,如使用vhost-net后端驱动XML的配置如下 4.virtio_blk