免费注册 查看新帖 |

Chinaunix

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

[网络子系统] 网卡来包时如果cpu处于软中断处理中,napi是不是会丢包 [复制链接]

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-20 23:03 |只看该作者 |倒序浏览
本帖最后由 mordorwww 于 2013-12-23 11:23 编辑

因为napi是在软中断收包,而软中断之间是不能抢占的,只能顺序执行
anenbupt 该用户已被删除
2 [报告]
发表于 2013-12-21 21:08 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
3 [报告]
发表于 2013-12-22 00:37 来自手机 |只看该作者
本帖最后由 mordorwww 于 2013-12-23 08:42 编辑

网卡缓存很小,满了就丢包
软件里也有缓存,只是不知道软件里的缓存是怎么起作用的

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
4 [报告]
发表于 2013-12-23 11:04 |只看该作者
回复 3# mordorwww
网卡缓存很小,满了就丢包
软件里也有缓存,只是不知道软件里的缓存是怎么起作用的

这里以e1000为例说明一下:
1.首先,驱动加载后会在主内存中为收发数据建立一个环形的缓冲队列(通常叫DMA环形缓冲区)。
2.内核将这个缓冲区通过DMA映射,把这个队列交给网卡;
3.网卡收到数据,就直接放进这个环形缓冲区了,之后才会触发中断

所有说,数据包被缓存到了这个DMA缓存缓存区中,这个缓存区会为每个接受队列分配空间,相对来说还是比较大的

e1000_up---->e1000_configure--->alloc_rx_buf---->e1000_alloc_rx_buffers

   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
5 [报告]
发表于 2013-12-23 11:16 |只看该作者
本帖最后由 mordorwww 于 2013-12-23 11:24 编辑
瀚海书香 发表于 2013-12-23 11:04
回复 3# mordorwww

这里以e1000为例说明一下:


这个是啊,问题是

除了这个DMA buffer 环形队列,网络包至少还有个缓存队列: enqueue_to_backlog, 这个队列是per  CPU的吧。
如果都是靠网卡DMA buffer来缓存突发报文,那么enqueue_to_backlog这个队列又是来起什么作用的?enqueue_to_backlog这个队列能不能起到缓存突发报文的作用,还是仅仅起多cpu分发的作用,如果单个cpu收包处理协议包又会怎样

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
6 [报告]
发表于 2013-12-23 12:13 |只看该作者
回复 5# mordorwww
除了这个DMA buffer 环形队列,网络包至少还有个缓存队列: enqueue_to_backlog, 这个队列是per  CPU的吧。
如果都是靠网卡DMA buffer来缓存突发报文,那么enqueue_to_backlog这个队列又是来起什么作用的?enqueue_to_backlog这个队列能不能起到缓存突发报文的作用,还是仅仅起多cpu分发的作用,如果单个cpu收包处理协议包又会怎样


1. RPS关闭
对于有自己缓存队列的网卡,不会走到enqueue_to_backlog

2. RPS开启
对于有自己缓存队列的网卡,数据包会通过enqueue_to_backlog挂载到per cpu上。这个队列只是起到一个链表的作用,skb的内存空间还是网卡环形缓存区中的。这个队列的最大长度可以通过net.core.netdev_max_backlog配置。


综合来看,对于有缓存队列的网卡来说,如果有突发数据包,中断处理数据包通过使DMA缓存缓存区,之后软中断处理都不会额外申请缓存区了。
   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
7 [报告]
发表于 2013-12-23 12:26 |只看该作者
本帖最后由 mordorwww 于 2013-12-23 12:30 编辑
瀚海书香 发表于 2013-12-23 12:13
回复 5# mordorwww


主要是困惑,缓存突发报文指针的缓存队列(无论包内存在哪里分配)到底包含back_log队列不,在NAPI单cpu下,挂back_log队列那个动作可以抢占协议栈包处理过程动作么(或者她俩之间还有调度?)?
如果不能抢占的话(就是只能顺序执行了),那CPU就一直处理back_log队列里的包,等处理完了可能DMA buffer就溢出了

论坛徽章:
6
金牛座
日期:2013-10-08 10:19:10技术图书徽章
日期:2013-10-14 16:24:09CU十二周年纪念徽章
日期:2013-10-24 15:41:34狮子座
日期:2013-11-24 19:26:19未羊
日期:2014-01-23 15:50:002015年亚洲杯之阿联酋
日期:2015-05-09 14:36:15
8 [报告]
发表于 2013-12-23 13:16 |只看该作者
回复 7# mordorwww
主要是困惑,缓存突发报文指针的缓存队列(无论包内存在哪里分配)到底包含back_log队列不,在NAPI单cpu下,挂back_log队列那个动作可以抢占协议栈包处理过程动作么(或者她俩之间还有调度?)?
如果不能抢占的话(就是只能顺序执行了),那CPU就一直处理back_log队列里的包,等处理完了可能DMA buffer就溢出了

刚才已经说的很清楚了啊。
以e1000为例。

如果RPS关闭,根本就不会用的back_log队列,软中断直接处理网卡缓存队列中的数据包。假设DMA缓存空间最多缓存512个数据包,如果缓存已经占满,这个时候再有数据包到达就会丢弃。
在这个处理过程中你需要考虑中断、软中断。当软中断在处理的时候,如果此时有数据包到达,直接就缓存到DMA缓存区中,这个过程是与软中断并行处理的。
所谓的软中断顺序处理,是指数据包下半部处理顺序执行,而从网卡接收数据包缓存到DMA缓冲区中,是在中断之前完成的。

总结来说,back_log在RPS关闭的情况下,起不到缓存突发报文的作用。而在RPS开启的情况下,可以认为起到作用,可缓存是数据包个数为max(DMA buffer skb, net.core.netdev_max_backlog)。
   

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
9 [报告]
发表于 2013-12-23 13:54 |只看该作者
本帖最后由 mordorwww 于 2013-12-23 13:56 编辑
瀚海书香 发表于 2013-12-23 13:16
回复 7# mordorwww

刚才已经说的很清楚了啊。



前面都没问题,第三段话我认为有点问题

"总结来说,back_log在RPS关闭的情况下,起不到缓存突发报文的作用。而在RPS开启的情况下,可以认为起到作用,可缓存是数据包个数为max(DMA buffer skb, net.core.netdev_max_backlog)。"

RPS情况下, back_log在单cpu情况或者收包CPU把包分发给自己的情况下可能起不到缓存的作用,这个时候可缓存的数据包个数仅为DMA buffer skb

论坛徽章:
9
程序设计版块每日发帖之星
日期:2016-02-13 06:20:00数据库技术版块每日发帖之星
日期:2016-06-15 06:20:00数据库技术版块每日发帖之星
日期:2016-06-16 06:20:00数据库技术版块每日发帖之星
日期:2016-06-18 06:20:00程序设计版块每日发帖之星
日期:2016-06-27 06:20:00程序设计版块每日发帖之星
日期:2016-07-09 06:20:00IT运维版块每日发帖之星
日期:2016-07-15 06:20:00IT运维版块每日发帖之星
日期:2016-07-27 06:20:00程序设计版块每日发帖之星
日期:2016-08-18 06:20:00
10 [报告]
发表于 2013-12-24 09:43 |只看该作者
我们做的这个东西就是NAPI+RPS, dma ring 4k, 实际的性能测试中dma ring 满的情况司空见惯,
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP