Linux的网络协议栈很独立,上下通过两个接口分别和用户态以及设备相连。也能够看作是北向和南向接口...北向通过socket接口,南向通过qdisc接口(你能够觉得是上层的netdev queue,对于接收接口,NAPI的poll队列则是还有一个样例)。无论是socket还是qdisc。都是基于队列来管理的,也就是说。三个部分是独立的。socket仅仅能看到读写队列。而看不到协议栈本身,socket在读一个数据的时候。它取的是队列里面的数据,至于说这个数据是谁放进去的,它并不知道。是不是协议栈放进去的,它也不必验证。
       socket隔离了用户进程和协议栈,RX/TX queue隔离了协议栈和设备驱动。
       这样的隔离方式给编程和设计带来了简便,然而却不利于性能。
       Linux的RPS设计,旨在让一个CPU既处理数据包的协议栈接收流程(软中断内核线程上下文,或者随意上下文的软中断处理),又运行用户态处理该数据包的进程。

我说这样的设计有利也有弊。假设仅仅是旨在提高cache利用率,那么这样的设计是对的,可是有没有想过别的情况,假设一个CPU在NET RX软中断处理的最后将一个skb推到了一个socket队列。并试图唤醒等待进程,那么它下一步该干些什么呢?实际上它下一步应该返回设备。继续去poll下一个skb,然而RPS的设计不是这样。RPS的设计旨在希望让该CPU继续处理用户态进程....这就必定要进行一次进程切换以及用户/内核态的切换,尽管server的CPU cache利用率提高了,可是协议栈处理相关的CPU cache利用率反而减少了。其实,CPU cache是否在进程切换以及用户/内核态切换后刷新,这个是体系结构相关的,并非说全部的体系结构都能带来好的结果。
       必须做进一步的測试。
       我觉得最好的办法就是用户进程和内核的NET RX软中断处在不同的CPU核心上,然而这两个CPU核心共享二级cache或者三级cache。

...
       Linux内核随之发展出了更好的方案。那就是突破上述的独立三大部分,让socket直接深入到设备层直接poll skb!!

注意。这是一个poll操作,并非让socket直接处理协议栈流程。

socket直接poll的意思是说。socket在队列中没有读到数据包的时候,并非睡眠。然后等待NET RX内核线程将数据包放入队列后将其唤醒,而是直接去问设备:如今有数据包吗?假设有,我直接带走它们去协议栈,而不须要你送它们去了。这是一种“拉”的方式。而不是以往的那种“推”的方式。拉和推的差别在于。对于接收者,拉是同一个实体,是主动的,而推则是被动的。

这就攻克了RPS试图解决却又没有完美解决的问题。

这样的机制叫做busy poll。
       RPS试图让软中断处理完数据包后,切换到用户进程,此时软中断将间歇。然后数据包中断后又要切回来...busy poll就不是这样,它直接绕过了软中断这个运行体,直接靠socket自身所在的运行体来主动拉取数据包进行处理。

避免了大量的任务交接导致的切换问题。

我不晓得对于转发的情况,是否也能採用busy poll的方式来提高性能,这须要測试。以上的阐述仅仅是理想情况,真实情况是。socket可能替别的socket从设备拉取了一个数据包。甚至这个数据包仅仅是转发的,不与不论什么socket关联...由于数据包仅仅有经过标准的路由以及四层处理后,才干和一个详细socket关联。在设备驱动层。指望找到这个关联是徒劳且无望的!无论怎么说。控制权在用户自己手中,凭概率来讲,假设你的设备中大量的数据包都是转发包,就不要开启这个功能,假设你的进程拥有少量的socket处理大量的数据包,那就开启它,无论如何,这仅仅是一个使用方法和配置的问题,何时开启,以及份额设置多少,须要一个事前採样的过程。

今天早上起太早。写了两篇随笔。所以也就没出去溜,如今快七点了。小小和孩她妈还睡着呢,我准备下去上班了....

Linux内核3.11的socket busy poll机制避免睡眠切换的更多相关文章

  1. Linux内核 TCP/IP、Socket参数调优

    Linux内核 TCP/IP.Socket参数调优 2014-06-06  Harrison....   阅 9611  转 165 转藏到我的图书馆   微信分享:   Doc1: /proc/sy ...

  2. TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现

    题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...

  3. Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡

    0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...

  4. Linux内核0.11代码阅读(转)

    最近决定开始阅读Linux 0.11的源代码. 学习Linux操作系统的核心概念最好的方法莫过于阅读源代码.而Linux当前最新的源代码包已经有70MB左右,代码十分庞大,要想深入阅读十分困难.而Li ...

  5. 解析 Linux 内核可装载模块的版本检查机制

    转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可 ...

  6. Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程

    20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...

  7. LINUX内核分析第八周学习总结:进程的切换和系统的一般执行过程

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关 ...

  8. (转)Linux内核 TCP/IP、Socket参数调优

    Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失) ...

  9. Linux内核0.11 setup文件说明

    一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...

随机推荐

  1. [cocos2dx笔记003] Vs2013添加静态库project

    (基于2.2.2版本号.用vs2013编辑代码)(cppblog版本号:http://www.cppblog.com/zdhsoft/archive/2014/05/11/206890.html) 在 ...

  2. JSTL fmt 格式化时间

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. Android图片加载框架最全解析(一),Glide的基本用法

    现在Android上的图片加载框架非常成熟,从最早的老牌图片加载框架UniversalImageLoader,到后来Google推出的Volley,再到后来的新兴军Glide和Picasso,当然还有 ...

  4. FFmpeg的H264编码有内存泄漏吗??!!!

    靠,内存泄漏好严重.开始怀疑是自己代码问题,调试了半天,又反复改写和优化代码,还是泄漏严重. 拿网上现成的FFMPEG H264编码的范例来测试,同样泄漏很严重. 百度了一下,有很多人遇到同样的问题, ...

  5. Coursera课程《大家的python》(Python for everyone)课件

    You can access the Google Drive containing all of the current and in-progress lecture slides for thi ...

  6. iOS开发-xCode6(iOS 8)中应用程序图标和启动页面设置

    iOS8中设置应用程序图标跟之前没有什么变化,命名规则不变,不过至于设置启动页面,网上给的方式很多都是模棱两可的,东平西凑总算是把启动页面的图片设置成功了,iOS设置启动图片有两种方式一种是Launc ...

  7. AS .ignore插件 忽略文件

    AS自带的.ignore文件 在AS中新建项目时,默认会创建一个.ignore文件,其中默认忽略的是 *.iml .gradle /local.properties /.idea/workspace. ...

  8. jsp链接sqlserver连不上

    有时候出现程序没有错误,但是就是连不上数据库的毛病,有时候是链接端口错误. private String url="jdbc:microsoft:sqlserver://localhost: ...

  9. Linux学习笔记之初级篇

    第一部分:[安装注意环节] 第二部分:[常用命令小试] 第三部分:[oracle的安装]

  10. Python构造字符串

    不断报错 coercing to Unicode : 不要用+连接字符串,要用格式化字符串 None的问题:只能用 or “”的方式来解决了 not all arguments converted d ...