一种针对半虚拟化网卡的数据包高效发送方法

文档序号:10724713阅读:451来源:国知局
一种针对半虚拟化网卡的数据包高效发送方法
【专利摘要】本发明公开了一种针对半虚拟化网卡的数据包高效发送方法,借鉴Linux NAPI的设计,让I/O线程在处理发送队列时,根据客户机发送数据包的频率自动切换通知模式和轮询模式:如果客户机发送数据包的频率高于某个阈值,则持续轮询发送队列中是否有数据需要处理,保持客户机的通知机制处于关闭状态,消减VM Exit数量;如果客户机发送数据包的频率低于某个阈值,则退出轮询模式,并开启客户机的通知机制,等待下一次被唤醒,减少CPU资源的浪费。用两个I/O线程分别处理发送队列和接收队列,这两个I/O线程运行在同一个物理核上,它们之间的公平性由CFS调度器保证,CFS调度器会根据线程的运行时间、睡眠时间等实现公平调度。
【专利说明】
一种针对半虚拟化网卡的数据包高效发送方法
技术领域
[0001]本发明涉及系统网络I/O虚拟化、半虚拟化网卡领域,尤其涉及一种针对半虚拟化网卡的数据包高效发送方法。
【背景技术】
[0002]半虚拟化网卡技术通过对客户机操作系统进行修改,让其意识到自己处于虚拟化环境中,从而可以和VMM相互协作,极大地提升网络I/O性能。而与之相比,传统的全虚拟化网卡,虽然有很高的灵活性和兼容性,但每次I/O操作的路径太长,有较多的VM Entry和VMExit发生,且需要多次上下文切换和数据复制,性能较差。因此,半虚拟化网卡已经成为当前的主流I/O虚拟化技术之一,被广泛应用于虚拟机的网络部署。
[0003]半虚拟化通常由前端(Frontend)和后端(Backend)两部分组成:前端处理程序是位于客户机的驱动模块,后端处理程序是位于宿主机的I/O线程,两者通过发送和接收两个队列进行交互。每个半虚拟化网卡会对应一个I/O线程,该线程同时负责发送队列和接收队列的处理,如果当前没有任务,该线程处于睡眠状态。
[0004]当外界有数据包到达半虚拟化网卡时,I/O线程被唤醒并处理接收队列:将数据写入接收队列,通知客户机有数据达到,客户机接收到通知后从接收队列中获取数据。当客户机需要向外界发送数据包时,首先将数据写入发送队列,然后通知I/O线程,I/O线程被唤醒并处理发送队列:从发送队列获取数据,将数据传输至外界,传输成功后告知客户机。如果发送队列和接收队列都有任务时,I/O线程会轮流进行处理并保证公平性。
[0005]由于发送和接收队列通过共享内存来实现,半虚拟化网卡在数据传输上的性能很好,但在通知机制上还存在瓶颈。当客户机通知I/O线程有数据包需要传输时,会执行I/O特权指令,造成VM Exi t,VMM分析Exi t原因后,帮助客户机通知I/0线程。因此,客户机使用半虚拟化网卡向外界发送数据包时,会产生大量的VM Exit,对I/O响应延迟和网络吞吐量造成影响。
[0006]因此,本领域的技术人员致力于开发一种针对半虚拟化网卡的数据包高效发送方法,消减使用半虚拟化网卡发送数据包时的VM Exit数量,提升I/O性能。

【发明内容】

[0007]鉴于现有技术的上述缺陷,本发明所要解决的问题是尽可能消减使用半虚拟化网卡发送数据包时的VM Exit数量,提升I/O性能。
[0008]为实现该目的,本发明提供一种针对半虚拟化网卡的数据包高效发送方法,包括以下步骤:
[0009]步骤I:在初始化vhost模块时创建两个线程,线程A负责接收队列的处理,线程B负责发送队列的处理。
[0010]步骤2:对于接收队列仍采用原来的处理方式,如图2所示。当半虚拟化网卡接收到来自外界的数据包时,唤醒线程A。[0011 ]步骤3:线程A查看接收缓冲区中是否有数据。
[0012]步骤3-1:如果有数据,则处理接收队列:将数据写入接收队列,通知客户机有数据达到,客户机接收到通知后从接收队列中获取数据;处理完毕接收队列之后,转至步骤3。
[0013]步骤3-2:如果没有数据,则线程A进入睡眠状态,等待下一次被唤醒。
[0014]步骤4:对于发送队列,根据客户机发送数据包的频率自动切换通知模式和轮询模式,如图3所示。客户机发送数据包,执行1特权指令造成VM Exit,KVM通知线程B有数据包需要传输,线程B被唤醒。
[0015]步骤5:线程B关闭客户机通知机制,进入轮询状态,轮询发送队列中是否有数据,并统计一次轮询或一段时间内处理的数据包数量。
[0016]步骤6:如果数据包数量高于某个阈值,说明客户机发送数据包的频率较高,则转至步骤5,继续轮询,减少VM Exit数量。
[0017]步骤7:如果数据包数量低于某个阈值,说明客户机发送数据包的频率较低,则退出轮询模式,打开客户机的通知机制,线程B睡眠,等待下一次被唤醒,减少CPU资源的浪费。
[0018]步骤8:线程A和B运行在同一个物理核上,CFS调度器会根据线程的运行时间、睡眠时间等实现公平调度。
[0019]本发明的设计思路:首先,借鉴LinuxNAPI的设计,让I/O线程在处理发送队列时,根据客户机发送数据包的频率自动切换通知模式和轮询模式。如果客户机发送数据包的频率高于某个阈值,则持续轮询发送队列中是否有数据需要处理,保持客户机的通知机制处于关闭状态,消减VM Exit数量;如果客户机发送数据包的频率低于某个阈值,则退出轮询模式,并开启客户机的通知机制,等待下一次被唤醒,减少CPU资源的浪费。其次,由于对接收队列的处理仍属于通知唤醒制,当持续轮询发送队列时,很难在一个I/O线程中保证两者的公平。为此,本发明提出再创建一个线程用于处理发送队列,原来的线程用于处理接收队列,由CFS调度器负责调度这两个线程并维护它们之间的公平性。
[0020]以下将结合附图对本发明的构思、具体结构及产生的技术效果作进一步说明,以充分地了解本发明的目的、特征和效果。
【附图说明】
[0021]图1是本发明一个较佳实施例的KVM半虚拟化网卡架构图;
[0022]图2是本发明一个较佳实施例的接收队列处理流程图;
[0023]图3是本发明一个较佳实施例的发送队列处理流程图。
【具体实施方式】
[0024]以下将结合附图对本发明的实施例做详细说明。本实施例在本发明技术方案的前提下进行实施,并给出详细实施方式和具体操作过程,但是适用平台不仅限于下述实施例。
[0025]本实施例的平台采用主流的虚拟化解决方案之一KVM,KVM的半虚拟化网卡架构如图1所示,前端处理程序是位于客户机的virt1-net驱动模块,后端处理程序是位于宿主机内核空间的vhost-net模块,两者通过发送和接收两个虚拟队列进行交互。当客户机需要发送数据包时,virt1驱动先将数据写入发送队列,然后执行1特权指令造成VM Exit,KVM分析Exit原因,通过1eventfd通知vhost有数据包需要传输,vhost收到通知后从发送队列中获取数据,并借助虚拟交换机将数据传输至外界。
[0026]本发明提供一种针对半虚拟化网卡的数据包高效发送方法,包括以下步骤:
[0027]步骤I:在初始化vhost模块时创建两个线程,线程A负责接收队列的处理,线程B负责发送队列的处理。
[0028]步骤2:对于接收队列仍采用原来的处理方式,如图2所示。当半虚拟化网卡接收到来自外界的数据包时,唤醒线程A。
[0029 ]步骤3:线程A查看接收缓冲区中是否有数据。
[0030]步骤3-1:如果有数据,则处理接收队列:将数据写入接收队列,通知客户机有数据达到,客户机接收到通知后从接收队列中获取数据;处理完毕接收队列之后,转至步骤3。[0031 ]步骤3-2:如果没有数据,则线程A进入睡眠状态,等待下一次被唤醒。
[0032]步骤4:对于发送队列,根据客户机发送数据包的频率自动切换通知模式和轮询模式,如图3所示。客户机发送数据包,执行1特权指令造成VM Exit,KVM通知线程B有数据包需要传输,线程B被唤醒。
[0033]步骤5:线程B关闭客户机通知机制,进入轮询状态,轮询发送队列中是否有数据,并统计一次轮询或一段时间内处理的数据包数量。
[0034]步骤6:如果数据包数量高于某个阈值,说明客户机发送数据包的频率较高,则转至步骤5,继续轮询,减少VM Exit数量。
[0035]步骤7:如果数据包数量低于某个阈值,说明客户机发送数据包的频率较低,则退出轮询模式,打开客户机的通知机制,线程B睡眠,等待下一次被唤醒,减少CPU资源的浪费。
[0036]步骤8:线程A和B运行在同一个物理核上,CFS调度器会根据线程的运行时间、睡眠时间等实现公平调度。
[0037]以上详细描述了本发明的较佳具体实施例。应当理解,本领域的普通技术无需创造性劳动就可以根据本发明的构思作出诸多修改和变化。因此,凡本技术领域中技术人员依本发明的构思在现有技术的基础上通过逻辑分析、推理或者有限的实验可以得到的技术方案,皆应在由权利要求书所确定的保护范围内。
【主权项】
1.一种针对半虚拟化网卡的数据包高效发送方法,其特征在于,包括以下步骤: 步骤1:在初始化Vhost模块时创建两个线程,线程A负责接收队列的处理,线程B负责发送队列的处理; 步骤2:当半虚拟化网卡接收到来自外界的数据包时,唤醒线程A; 步骤3:线程A查看接收缓冲区中是否有数据; 步骤3-1:如果有数据,则处理接收队列:将数据写入接收队列,通知客户机有数据到达,客户机接收到通知后从接收队列中获取数据;处理完毕接收队列之后,转至步骤3; 步骤3-2:如果没有数据,则线程A进入睡眠状态,等待下一次被唤醒; 步骤4:发送队列被配置为根据客户机发送数据包的频率自动切换通知模式和轮询模式;客户机发送数据包,执行1特权指令造成VM Exit,KVM通知线程B有数据包需要传输,线程B被唤醒; 步骤5:线程B关闭客户机通知机制,进入轮询状态,轮询发送队列中是否有数据,并统计一次轮询或一段时间内处理的数据包数量; 步骤6:如果数据包数量高于阈值,说明客户机发送数据包的频率较高,则转至步骤5,继续轮询,减少VM Exi t数量; 步骤7:如果数据包数量低于阈值,说明客户机发送数据包的频率较低,则退出轮询模式,打开客户机的通知机制,线程B睡眠,等待下一次被唤醒,减少CPU资源的浪费; 步骤8:线程A和B运行在同一个物理核上,CFS调度器根据线程的运行时间和睡眠时间进行公平调度。
【文档编号】G06F9/50GK106095580SQ201610421258
【公开日】2016年11月9日
【申请日】2016年6月14日 公开号201610421258.8, CN 106095580 A, CN 106095580A, CN 201610421258, CN-A-106095580, CN106095580 A, CN106095580A, CN201610421258, CN201610421258.8
【发明人】管海兵, 胡小康, 张望, 马汝辉, 李健
【申请人】上海交通大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1