免费注册 查看新帖 |

Chinaunix

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

linux 3.0.2内核网络部分接收数据包较2.6.24内核的改进--RPS [复制链接]

论坛徽章:
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
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-15 15:36 |只看该作者 |倒序浏览
《一》RPS是google向内核提交的一个软中断负载均衡的patch。(好像从2.6.35开始,这个patch才进入了linux的main tree)
        这里简单说明一下RPS的处理流程:
        在3.0.2中所有的网卡,不管是否支持napi,都是通过struct napi_struct结构进行。所有我们先说一下这个结构。
  1. struct napi_struct {
  2. 354 /* The poll_list must only be managed by the entity which
  3. 355 * changes the state of the NAPI_STATE_SCHED bit. This means
  4. 356 * whoever atomically sets that bit can add this napi_struct
  5. 357 * to the per-cpu poll_list, and whoever clears that bit
  6. 358 * can remove from the list right before clearing the bit.
  7. 359 */
  8. 360 struct list_head poll_list;
  9. 361
  10. 362 unsigned long state;
  11. 363 int weight;
  12. 364 int (*poll)(struct napi_struct *, int);
  13. 365 #ifdef CONFIG_NETPOLL
  14. 366 spinlock_t poll_lock;
  15. 367 int poll_owner;
  16. 368 #endif
  17. 369
  18. 370 unsigned int gro_count;
  19. 371
  20. 372 struct net_device *dev;
  21. 373 struct list_head dev_list;
  22. 374 struct sk_buff *gro_list;
  23. 375 struct sk_buff *skb;
  24. 376 };
复制代码
对应支持napi的网卡,自己填充这个结构体;而非napi网卡,则使用per cpu的softnet_data->backlog,这个结构的初始化在net_dev_init()中完成。
      我们先说一下非napi机制的网卡:
      这里还是区分NAPI的网卡和非NAPI的网卡
     1. 非NAPI的网卡:
         驱动接收到数据包-->dma到内核空间-->netif_rx-->enqueue_to_backlog (根据数据包的hash值,将数据包放到对应的CPU的softnet_data.input_pkt_queue中)-->等待软中断调度
         软中断调度后,会执行函数process_backlog。(这个函数最后会调用netif_receive_skb,将skb向上层传递)
     2. NAPI的网卡:
         驱动接收到数据包-->dma到内核空间-->将数据包放到自动的队列中-->等待软中断调度
        在之前的内核版本中(RPS功能添加之前),NAPI的网卡软中断调度,直接从网卡自己的队列中dequeue一个skb,然后netif_receive_skb(),直接将数据包向上层传递。
        在RPS的内核中,netif_receive_skb()函数并不是直接向上层传递skb,而是:
                dequeue-个skb-->enqueue_to_backlog(根据数据包的hash值,将数据包放到对应的CPU的softnet_data.input_pkt_queue中)-->等待软中断调度。
        也就是说,在RPS的内核下,不管你是否是NAPI的驱动,所有的数据包在真正处理之前,都会放到相应的每cpu的softnet_data.input_pkt_queue,然后再被处理。

评分

参与人数 1可用积分 +10 收起 理由
Godbach + 10 感谢分享

查看全部评分

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
2 [报告]
发表于 2011-09-15 17:01 |只看该作者
本帖最后由 Godbach 于 2011-09-15 17:02 编辑

回复 1# 瀚海书香

感谢分享。
RPS 的 hash 算法能否保证一个流的数据包都能够分到同一个 CPU 上吗

其次,NAPI 的话,数据包要先被放入 网卡的队列,随后在添加到 per-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
3 [报告]
发表于 2011-09-15 19:02 |只看该作者
回复  瀚海书香

感谢分享。
RPS 的 hash 算法能否保证一个流的数据包都能够分到同一个 CPU 上吗

其 ...
Godbach 发表于 2011-09-15 17:01



  1.RPS可以保证hash算法将一个流的数据包分配到同一个CPU上。除非要分配的CPU unset or dead ...
   
  2.NAPI的网卡数据包是需要调度两次的,当然也就是入队两次。第一次NAPI_SCHEDULE调度网卡自己的NAPI函数,将自身队列中的数据包放到对应的CPU的input_pkt_queue中,同时将网卡上的数据包dma到自身的队列中,然后返回;当第二次NAPI_SCHEDULE到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
4 [报告]
发表于 2013-12-08 00:32 |只看该作者
本帖最后由 mordorwww 于 2013-12-08 00:51 编辑
瀚海书香 发表于 2011-09-15 19:02
1.RPS可以保证hash算法将一个流的数据包分配到同一个CPU上。除非要分配的CPU unset or dead ...
  ...




如果poll收包的cpu和协议处理包的cpu是不同的cpu同一个, poll收包的cpu向协议处理包发起ipi中断,迫使对方进入协议栈软中断,对吧



如果poll收包的cpu和协议处理包的cpu是同一个CPU,那又是如何schedule的呢

而且不解的是,在第二次schedule时,网卡中断已经打开了,所以在协议处理包的时候,发生了硬中断时,此时还在协议处理包软中断中,那么这个时候不能马上收包了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP