免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4476 | 回复: 2
打印 上一主题 下一主题

[内核入门] DPDK中断轮循权衡以及零拷贝 [复制链接]

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-01-13 18:59 |只看该作者 |倒序浏览
本帖最后由 _nosay 于 2017-01-13 19:36 编辑

报文从网卡传输到应用程序可以访问的内存,从逻辑上讲,要经历两个过程:
1. 从网卡经过PCI总线,传输到内核空间对应的内存(PCI设置必须在内核态操作,最初安排的内存当然就在内核空间);
2. 驱动开始工作(如何开始?如何工作?)。

  • 过程1分析
① 网卡中断流程(硬件完成):
a. 网卡→CPU:不使用DMA时,网卡收到报文后,向CPU发送中断信号。
b. 网卡→DMA→CPU:网卡收到报文,通知DMA,DMA完成传输后,再向CPU发送中断信号。

我疑惑过,DMA会夺走CPU对数据总线、地址总线的控制权,那么CPU就得停下来,只是换个东西工作,而不是肩并肩工作,凭什么会快?
首先,DMA单纯做一种工作,即使正在工作时收到网卡通知,它大可先让网卡等着,因为它本来就已经是在为网卡服务,而CPU服务于很多硬件的请求,对于优先级高的请求,它必须马上响应,要对当前的工作现场进行保护,这样相对于DMA就显得墨迹了,而且响应完后回到原来的工作状态,又得恢复现场;
另外,DMA工作时,CPU不一定就得停下来,根据硬件设计的好坏,在适合的场合可以选择让它们交替使用总线。
详见:http://wenku.baidu.com/link?url=WwIaHaMVNaf4fUnUxnVx39ovKyZZUClILeZl9YYzadaGXUeUvcGCyy5o9G2TfU-iq_5wTYnzbkE9cZmG0j2xY7OqB6_ZwAGoZJQYnxEsngu

② 轮循
为了让CPU得知有报文收到,除了外设向CPU发送中断信号,还可以CPU自己去轮循检查:
a. 无DMA:CPU通过自己从PCI总线读网卡状态寄存器,不断判断网卡是否收到报文,这种轮循的代价很高,而且只能在内核态做,但最终的权衡,仍要综合考虑其它因素。
b. 有DMA:CPU通过DMA写到内存的网卡状态寄存器值,不断判断网卡是否收到报文。

是否有DMA以及DMA设计的好坏是硬件方面需要考虑的,不是DPDK的技术,所以以下不妨用有DMA的系统讨论,从而“过程2分析”关注两个问题:
数据从网卡到达内核空间后,是通过中断信号让驱动工作,还是驱动自己轮循启动进一步的工作?
报文到达内核空间的后续如何处理,效果更好?

  • 过程2分析
① 如何开始?
上述介绍过中断/轮循过程,现在分析在特定场合下应该如何选择:
a. 中断:DMA向CPU发送中断信号,CPU放下当前正在做的事,切换现场,执行驱动程序处理报文,处理结束后恢复现场继续之前做的事;
b. 轮循:驱动分到时间片时,总是安排CPU不断检查DMA目标内存是否有收到的报文,一直没有的话,就相当于CPU没有做什么实事。

假设:报文到达的时间间隔(1s)<进程时间片(3s),处理3个报文
轮循方式:没有任何切换时,进程可以等到全部报文;
中断方式:进程花1s等到第一个报文→中断→进程花1s等到第二个报文→中断→进程花1s等到第三个报文,相比于轮循的方式,接收到3个报文的过程中凭白多了由于中断造成的切换。

假设:报文到达的时间间隔(3s)>进程时间片(1s),处理1个报文
中断方式:进程睡眠3s,中断时被huàn醒,并收到报文;
轮循方式:报文到达前的3s,进程一直不放弃自己的时间片,占着CPU花了精力,却没等到报文到达。

针对大流量环境下,网卡超级频繁的接收报文,DPDK将驱动设计为轮循方式。

② 如何工作?
即报文到达内核空间后,如何交给用户态逻辑处理?
a. 内核协议栈:内核由于要考虑整个系统各个进程之间的保护以及资源分配的合理性,它的机制对于各个用户进程都是平等的,内核空间的数据如果需要交给用户进程访问,就要复制到该进程的用户空间,因为内核需要考虑有多个网络应用程序的情况(用户空间、内核空间只是对虚拟空间的划分,复制到用户空间是指在实际的物理内存进行复制操作,并映射到该进程的用户空间)。
b. DPDK:     相对于内核程序,DPDK相当于是一个定制软件,对于一个单一需求的抓包设备,核心围绕着的是一个网络应用程序,而不是多个网络应用程序,而且报文数据虽然在内核空间,但它的性质只是网络数据,即使被修改,也不会影响操作系统以及其它进程的稳定性,所以就可以绕开内核的协议栈,直接将报文所在的内核空间映射到抓包进程的用户空间,即零拷贝。

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2017-01-20 10:17 |只看该作者
dpdk处理的报文数据不在内核态。

网卡是个外设,它需要cpu提供DMA buffer来存放接收数据,至于这个buffer来自内核态还是用户态,网卡根本不关心。

论坛徽章:
13
15-16赛季CBA联赛之八一
日期:2016-07-08 21:00:1415-16赛季CBA联赛之同曦
日期:2017-02-15 14:26:1515-16赛季CBA联赛之佛山
日期:2017-02-20 14:19:2615-16赛季CBA联赛之青岛
日期:2017-05-07 16:49:1115-16赛季CBA联赛之广夏
日期:2017-07-30 09:13:1215-16赛季CBA联赛之广东
日期:2018-07-05 22:34:3615-16赛季CBA联赛之江苏
日期:2018-09-03 12:10:2115-16赛季CBA联赛之上海
日期:2018-09-25 03:49:2215-16赛季CBA联赛之广东
日期:2018-09-25 04:09:12
3 [报告]
发表于 2017-01-20 12:18 |只看该作者
回复 2# nswcfd


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP