[Virtualization][qemu][kvm][virtio] 使用 QEMU/KVM 模拟网卡多队列

序:

做DPDK例子的时候,发现一些例子需要多队列,而我当前所使用的虚拟机并不是多队列的。关于我当前虚拟机的状态,可以见前文。

所以,我的需求就是,让虚拟机里的网卡,有多队列!

参考:

http://www.linux-kvm.org/page/Multiqueue

https://gist.github.com/sibiaoluo/11133723

原理上没大看懂,半懂不懂的。目的优先。

查看:

  如何查看网卡是否支持多队列: 红色的行就代表支持了。 MSI-X就是支持多队列的意思,MSI是什么意思,我也不知道。

  Count=64 代表支持64个队列。

[[email protected] 20161206]# lspci |grep 82599
21:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
21:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
[[email protected] 20161206]# lspci -vv -s 21:00.0 |grep MSI
        Capabilities: [50] MSI: Enable- Count=1/1 Maskable+ 64bit+
        Capabilities: [70] MSI-X: Enable+ Count=64 Masked-
        Capabilities: [a0] Express (v2) Endpoint, MSI 00
[[email protected] 20161206]# 

  再查看: 队列分了四种,RX,TX,Other,Combined。 63代表 combined可以设置的最大值是63. 24代表当前的队列设置是24

[[email protected] 20161206]# ethtool -l eth4
Channel parameters for eth4:
Pre-set maximums:
RX:             0
TX:             0
Other:          1
Combined:       63
Current hardware settings:
RX:             0
TX:             0
Other:          1
Combined:       24

[[email protected] 20161206]# 

  当然这个值是可以该的,比如将24 改为 25:

[[email protected] ~]# ethtool -L eth1 combined 25

  再查看:中断

[[email protected] 20161206]# ls /sys/bus/pci/devices/0000\:21\:00.0/msi_irqs/
100  101  102  103  104  105  106  107  108  109  110  111  87  88  89  90  91  92  93  94  95  96  97  98  99
[[email protected] 20161206]# 

  还可以:

[[email protected] 20161206]# cat /proc/interrupts |grep eth4 |awk -F ‘ ‘ ‘{print $27}‘
eth4-TxRx-0
eth4-TxRx-1
eth4-TxRx-2
eth4-TxRx-3
eth4-TxRx-4
eth4-TxRx-5
eth4-TxRx-6
eth4-TxRx-7
eth4-TxRx-8
eth4-TxRx-9
eth4-TxRx-10
eth4-TxRx-11
eth4-TxRx-12
eth4-TxRx-13
eth4-TxRx-14
eth4-TxRx-15
eth4-TxRx-16
eth4-TxRx-17
eth4-TxRx-18
eth4-TxRx-19
eth4-TxRx-20
eth4-TxRx-21
eth4-TxRx-22
eth4-TxRx-23
eth4
[[email protected] 20161206]# ll /sys/

开始:

当前配置:

/home/tong/VM/dpdk [[email protected]] [12:00]
> cat start.sh
sudo qemu-system-x86_64 -nographic -vnc 127.0.0.1:1 -enable-kvm         -m 2G -cpu Nehalem -smp cores=2,threads=2,sockets=2         -numa node,mem=1G,cpus=0-3,nodeid=0         -numa node,mem=1G,cpus=4-7,nodeid=1         -drive file=disk.img,if=virtio         -net nic,vlan=0,model=virtio,macaddr=‘00:00:00:01:00:00‘         -net nic,vlan=1,model=virtio,macaddr=‘00:00:00:01:00:01‘         -net nic,vlan=2,model=virtio,macaddr=‘00:00:00:01:00:02‘         -net tap,vlan=0,ifname=tap-dpdk-ctrl         -net tap,vlan=1,ifname=tap-dpdk-1,script=no,downscript=no         -net tap,vlan=2,ifname=tap-dpdk-2,script=no,downscript=no &
#       -device vfio-pci,host=‘0000:00:19.0‘ #ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

/home/tong/VM/dpdk [[email protected]] [12:00]
> 

改完之后:红色部分为关键性修改。

vectors=32 修改了lspci中打印的那个countmq=on 的修改可以在“ip link”中被查看到,关键字 pfifo_fast 变成了 mq-netdev 和 -net 是有区别的。-net中包含vlan参数,即使没有显示指定它依然与queues参数相冲突。vhost=on 并不知道有什么用。不加的话好像也是可以的。queues=16 会在使用ethtool -l时查看到max为16 
/home/tong/VM/dpdk [[email protected]] [18:21]
> cat start-multiqueue.sh
sudo qemu-system-x86_64 -nographic -vnc 127.0.0.1:1 -enable-kvm         -m 2G -cpu Nehalem -smp cores=2,threads=2,sockets=2         -numa node,mem=1G,cpus=0-3,nodeid=0         -numa node,mem=1G,cpus=4-7,nodeid=1         -drive file=disk.img,if=virtio         -net nic,vlan=0,model=virtio,macaddr=‘00:00:00:01:00:00‘         -device virtio-net-pci,netdev=dev1,mac=‘00:00:00:01:00:01‘,vectors=32,mq=on         -device virtio-net-pci,netdev=dev2,mac=‘00:00:00:01:00:02‘,vectors=32,mq=on         -net tap,vlan=0,ifname=tap-dpdk-ctrl         -netdev tap,ifname=tap-dpdk-1,script=no,downscript=no,vhost=on,queues=16,id=dev1         -netdev tap,ifname=tap-dpdk-2,script=no,downscript=no,vhost=on,queues=16,id=dev2 &
#       -device vfio-pci,host=‘0000:00:19.0‘ #ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

  启动之后,生效的queue依然只有1,需要用ethtool修改之。

[[email protected] ~]# ethtool -L eth2 combined 4
[[email protected] ~]# ethtool -l eth2
Channel parameters for eth2:
Pre-set maximums:
RX:             0
TX:             0
Other:          0
Combined:       16
Current hardware settings:
RX:             0
TX:             0
Other:          0
Combined:       4

  但是在查看中断的时候,并没有变多,而是叫 virtio2-virtqueues 统一由一个中断队列处理。

[[email protected] ~]# ll /sys/bus/pci/devices/0000\:00\:05.0/msi_irqs/
total 0
-r--r--r--. 1 root root 4096 Dec  6 19:20 31
-r--r--r--. 1 root root 4096 Dec  6 19:20 32
[[email protected] ~]# cat /proc/interrupts |egrep "31|32"
 30:       5631          0          0          0          0          0          0          0   PCI-MSI-edge      virtio3-req.0
 31:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-config
 32:          2          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-virtqueues
[[email protected] ~]# 

  为啥没变多? 因为写的不太对,查看前文参考的红帽文档可以看见如下内容:

qemu-kvm -netdev tap,id=hn0,queues=M -device virtio-net-pci,netdev=hn0,vectors=2M+2

  然后把前文的 vectors=32 改成 vectors=34. 在guest中可以看见中断,一共33 个。

[[email protected] ~]# cat /proc/interrupts |grep virtio2
 62:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-config
 63:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.0
 64:          1          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.0
 65:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.1
 66:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.1
 67:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.2
 68:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.2
 69:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.3
 70:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.3
 71:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.4
 72:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.4
 73:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.5
 74:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.5
 75:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.6
 76:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.6
 77:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.7
 78:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.7
 79:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.8
 80:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.8
 81:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.9
 82:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.9
 83:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.10
 84:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.10
 85:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.11
 86:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.11
 87:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.12
 88:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.12
 89:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.13
 90:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.13
 91:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.14
 92:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.14
 93:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-input.15
 94:          0          0          0          0          0          0          0          0   PCI-MSI-edge      virtio2-output.15[[email protected] ~]# ls /sys/bus/pci/devices/0000\:00\:05.0/msi_irqs/ |wc -l  33[[email protected] ~]# 

  最终,QEMU启动命令脚本如下:

/home/tong/VM/dpdk [[email protected]] [19:50]
> cat start-multiqueue.sh
sudo qemu-system-x86_64 -nographic -vnc 127.0.0.1:1 -enable-kvm         -m 2G -cpu Nehalem -smp cores=2,threads=2,sockets=2         -numa node,mem=1G,cpus=0-3,nodeid=0         -numa node,mem=1G,cpus=4-7,nodeid=1         -drive file=disk.img,if=virtio         -net nic,vlan=0,model=virtio,macaddr=‘00:00:00:01:00:00‘         -device virtio-net-pci,netdev=dev1,mac=‘00:00:00:01:00:01‘,vectors=34,mq=on         -device virtio-net-pci,netdev=dev2,mac=‘00:00:00:01:00:02‘,vectors=34,mq=on         -net tap,vlan=0,ifname=tap-dpdk-ctrl         -netdev tap,ifname=tap-dpdk-1,script=no,downscript=no,vhost=on,queues=16,id=dev1         -netdev tap,ifname=tap-dpdk-2,script=no,downscript=no,vhost=on,queues=16,id=dev2 &
#       -device vfio-pci,host=‘0000:00:19.0‘ #ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

/home/tong/VM/dpdk [[email protected]] [19:50]
> 
时间: 2024-12-19 13:10:49

[Virtualization][qemu][kvm][virtio] 使用 QEMU/KVM 模拟网卡多队列的相关文章

KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]

学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvirt 介绍 (6)Nova 通过 libvirt 管理 QEMU/KVM 虚机 (7)快照 (snapshot) (8)迁移 (migration) 在 QEMU/KVM 中,客户机可以使用的设备大致可分为三类: 1. 模拟设备:完全由 QEMU 纯软件模拟的设备

I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization]

KVM 介绍(3):I/O 全虚拟化和准虚拟化 [KVM I/O QEMU Full-Virtualizaiton Para-virtualization] 学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分配和 SR-IOV (5)libvirt 介绍 (6)Nova 通过 libvirt 管理 QEMU/KVM 虚机 (7)快照 (snapsh

QEMU KVM Libvirt手册(10): KVM的各种限制

Overcommits KVM allows for both memory and disk space overcommit. However, hard errors resulting from exceeding available resources will result in guest failures. CPU overcommit is also supported but carries performance implications. Time Synchroniza

kvm virtio功能配置

1.virtio(virtual i/0)  本文的原理性图片来源于书本<kvm虚拟化技术 实战与原理解析> virtio 是一个在hypervisor之上的api,它对客户机的i/o操作进行优化 使用virtio前,一次客户机的i/o请求过程如下: (1)客户机的通过设备驱动程序(device driver)发起i/o请求 (2)i/o请求被kvm中的i/o操作捕获代码(i/o trap code)捕获 (3)捕获代码把这些请求缓存在i/o共享页(sharing page)并且通知qemu仿

kvm virtio使用

参考: <kvm虚拟化技术 实战解析与原理> http://tec.5lulu.com/detail/107mwn4e6aaa684c1.html http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=7934175&id=5679365 1.balloon技术简介: 通常来说,要改变客户机的内存大小,我们需要关闭客户机,用qemu-system-x86_64重新分配.这个是很不方便的,于是balloon技术出现了. b

[转] KVM VirtIO paravirtualized drivers: why they matter

http://www.ilsistemista.net/index.php/virtualization/42-kvm-virtio-paravirtualized-drivers-why-they-matter.html?limitstart=0 As you probably already know, there are basically two different schools in the virtualiztion champ: the para-virtualization o

virtio的qemu总线与设备模型

(很多内容是网上找的,+上我个人的一点理解,推荐大家去看 http://mnstory.net/2014/10/qemu-device-simulation 这篇文章) qemu启动时,如果配置了相应virtio设备,会对guest的pci总线,virtio设备等进行模拟,先来看看qemu的设备模拟,那i8254/PIT为例(PIT的硬件规范略过,有兴趣的话可以参考 http://wiki.osdev.org/Programmable_Interval_Timer) hw/timer/i8254

KVM虚拟化搭建及其KVM中LVM扩容

KVM虚拟化搭建及其KVM中LVM扩容 前言: 公司项目方最近有两台物理服务器系统分别为CentOS 7.2.需要部署KVM虚拟化,第一台服务器A需要虚拟出三台虚拟机(均为CentOS 7.2系统),服务器B上需要虚拟出三台CentOS 7.2 系统和两台windows server2012 系统.其中六台CentOS 7.2 虚拟机需要部署我们自己的平台,两台windows分别部署客户的平台.下面来为大家说一下KVM虚拟化的搭建,以及创建虚拟机的两种办法,及其操作使用.     KVM小课补:

CentOS 7创建自定义KVM模板(现有KVM迁移到另外一台机)

说明:创建KVM模板有个好处,不用每次都运行命令创建,并且可以为迁移做准备. 一.创建KVM模板 1.下载iso(省略) 2.创建磁盘 qemu-img create -f raw centos7.raw 50G 3.编写XML <domain type='kvm'> <name>centos7</name> <uuid>354ca6f8-d70e-485b-8d0b-2ec295056e09</uuid> <memory unit='Ki