学习,简单了解dpdk的一些基础知识,这里主要学习虚拟化相关基础知识。(个人课堂笔记,理性参考)
1:硬件支持 多队列网卡
1.1:多队列网卡:
===》网卡内部有多个队列,与CPU进行绑定,通过PCI总线进行数据分发。
===》1:数据先进行hash
===》2:根据hash后的结果,放入对应的队列中。
===》3:多队列网卡中的数据会触发中断,由PCI和CPU进行处理。
1.2:多队列网卡的发送与接收:
===>1:多队列网卡中数据的接收,需要知道网卡中有数据,通过硬件中断的方式,硬件中断在数据量小的时候可以满足。
=======》使用NAPI对单纯的硬件中断进行优化,有中断触发,数据就一直读, 因此rte_eth_rc_burst读出来得到数据是多个数组(多个队列即多个NAPI)。
===》2:多队列网卡数据的发送:send()和实际网卡的发送时两个步骤。
=======》通过队列,把send()接口和网卡发送进行拆分,对应的QDisc就是队列,可以是多个队列。
=======》多个QDIsc队列设计方案:FIFO,可以四元组检索对应放数据。 (可以设置)
多队列网卡队列可以与CPU进行绑定,使专门的CPU处理专门的队列。
1.3:dpdk与多队列网卡
配置:rte_eth_dev_configure() ===》对网卡进行配置
启动: rte_eth_rx_queue_setup() ===> 对RX队列的配置
rte_eth_tx_queue_setup() ===> 对TX队列的配置
接收: rte_eth_rx_burst()
发送:rte_eth_tx_burst()
2:虚拟化
2.1:主要从三个方面了解虚拟化:
1:CPU虚拟化
2:内存虚拟化
3:IO虚拟化(磁盘的虚拟化,网卡的虚拟化)
2.2:CPU虚拟化(共享)
CPU完全虚拟化: vmware虚拟工具创建的虚拟机
CPU的硬件辅助虚拟化:一个物理硬件(vsphere)上多个虚拟机,需要硬件指令的支持。
CPU的半虚拟化:docker虚拟机(使用的宿主机的CPU)
==>vt-x (主要针对CPU和内存的虚拟化)与vx-d (针对外设(DMA,网卡,IO)的虚拟化),对应南桥和北桥的概念。
2.3:内存虚拟化
这里涉及到的概念如图:
参考网址:一文看懂影子页表和扩展页表 - 51CTO.COM
2.3.1:影子页表技术:(维护页表)
虚拟机虚拟地址 《=》 物理机虚拟地址《》物理机物理地址
虚拟机的页表和物理机页表建立关联,访问虚拟机页表,通过关联找到物理机页表,然后找到实际物理地址。
2.3.2:EPT(扩展页表):(物理地址偏移)
虚拟机物理地址和宿主机物理地址有一个偏移量,直接通过虚拟机物理地址+偏移可以找到实际物理地址。
dpdk只是使用内存,这里的内存方案与dpdk无关。
2.4:I/O虚拟化
例如:虚拟机需要联网,网卡是如何使用的。
===》虚拟机可以直接使用网卡(透传),也可以虚拟机网卡数据转为物理机网卡数据,用网卡发送。
===》桥接和net模式只是逻辑上的差异,与I/O虚拟化无关。
===》虚拟机可以用vmxnet3虚拟出多队列网卡。
1:I/O半虚拟化 :不通过虚拟网卡,直接发给网卡数据取。(CS模型)
2:I/O全虚拟化: 虚拟出一个网卡,网卡数据发给物理机网卡进行发送。(性能不高)
3:I/O透传: 如插入一个硬件设备,虚拟机直接能识别,透传。
vmware的磁盘虚拟化:全虚拟化
vmware的网络:更偏向于透传。
这里区分i/o:磁盘i/o, 网络i/o, 其他外设鼠标键盘等i/o
3:dpdk的虚拟化
3.1:virtio 虚拟交换机,半虚拟化技术
对于不同的io,制定统一标准 virtio,针对外设,针对io。
读和写,宿主机和虚拟机之间设备的读和写,使用中间队列(可以是环设计)进行交互。
3.2:vhost 加速包处理
vhost: 适配针对的是所有的操作系统虚拟机。
DPDK vhost支持vhost-cuse(用户态字符设备)和vhost-user(用户态socket服务)两种消息机制,它负责为客户机中的virtio-net创建、管理和销毁vhost设备。
如图:该图来自网络:Vhost-user详解 - 简书 (jianshu.com)
相关demo源码和课程:C/C++Linux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 (qq.com)