Linux内核3.11的socket busy poll机制避免睡眠切换
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机制避免睡眠切换的更多相关文章
- Linux内核 TCP/IP、Socket参数调优
Linux内核 TCP/IP.Socket参数调优 2014-06-06 Harrison.... 阅 9611 转 165 转藏到我的图书馆 微信分享: Doc1: /proc/sy ...
- TCP/IP协议栈源码图解分析系列10:linux内核协议栈中对于socket相关API的实现
题记:本系列文章的目的是抛开书本从Linux内核源代码的角度详细分析TCP/IP协议栈内核相关技术 轻松搞定TCP/IP协议栈,原创文章欢迎交流, byhankswang@gmail.com linu ...
- Linux内核0.11体系结构 ——《Linux内核完全注释》笔记打卡
0 总体介绍 一个完整的操作系统主要由4部分组成:硬件.操作系统内核.操作系统服务和用户应用程序,如图0.1所示.操作系统内核程序主要用于对硬件资源的抽象和访问调度. 图0.1 操作系统组成部分 内核 ...
- Linux内核0.11代码阅读(转)
最近决定开始阅读Linux 0.11的源代码. 学习Linux操作系统的核心概念最好的方法莫过于阅读源代码.而Linux当前最新的源代码包已经有70MB左右,代码十分庞大,要想深入阅读十分困难.而Li ...
- 解析 Linux 内核可装载模块的版本检查机制
转自:http://www.ibm.com/developerworks/cn/linux/l-cn-kernelmodules/ 为保持 Linux 内核的稳定与可持续发展,内核在发展过程中引进了可 ...
- Linux内核分析——理解进程调度时机跟踪分析进程调度与进程切换的过程
20135125陈智威 +原创作品转载请注明出处 +<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验 ...
- LINUX内核分析第八周学习总结:进程的切换和系统的一般执行过程
韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.进程切换的关 ...
- (转)Linux内核 TCP/IP、Socket参数调优
Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sys/net目录下内容的修改都是临时的,任何修改在系统重启后都会丢失) ...
- Linux内核0.11 setup文件说明
一.总体功能介绍 这是关于Linux-kernel-0.11中boot文件夹下setup.s源文件的实现功能的总结说明. setup.s是一个操作系统加载程序,它的主要功能是利用BIOS中断读取机器系 ...
随机推荐
- [Asp.net web api]缓存
摘要 为了提高接口的性能,我们常做的优化就包括缓存,对经常访问但变化不大的数据进行缓存.或者使用http的缓存,减少请求的次数. web api缓存 在提供的api,我们也可以实现缓存,来减少访问的次 ...
- 与Win8之磁盘活动时间100%斗争心得
Windows8因人而异地会在使用过程中磁盘活动时间无缘无故提升到100%并且可能出现持续性抽风现象,具体表现为0%瞬间飙升至100%后又回落,或者一直保持在100%导致使用过程卡顿,认真阅读本文有助 ...
- FT项目开发技术点(三)
1.eclipse中开发的web项目怎么放到tomcat中? 记得开始学习Java Web的时候,首先用的是Eclipse开发,但是有一个问题始终没有弄明白,做好的Web项目是如何发布到Tomcat服 ...
- xtraTabbedMdiManager 双击最大化和关闭后返回主界面 z
双击tab头部时候子窗体Float时界面最大化和关闭Float状态的子窗体并不是真正关闭而是回到主界面的问题, 代码如下,其中xtraTabbedMdiManager1_Floating这个是xtra ...
- Maven最佳实践:Maven仓库
什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文 件,如log4j.jar,junit. ...
- 启明星产品与微软Active Directory活动目录集成说明
本文介绍启明星Helpdesk系统,如何和微软域集成. (1)确保在集成微软域之前,系统已经能够访问. (2)进入后台,用户管理页面,新加一个账户,此账户需要在微软域里(普通账户即可),然后在角色里设 ...
- OpenCV 脸部跟踪(2)
前面一篇文章中提到,我们在一副脸部图像上选取76个特征点,以及这些特征点的连通性信息来描述脸部形状特征,本文中我们会把这些特征点映射到一个标准形状模型. 通常,脸部形状特征点能 ...
- PHP语言基础之MySql 05 By ACReaper
PHP的基本语法学完后,我们马上学下PHP如何和MySql进行交互.PHP和MySql进行交互的API可以分为两类,一类是面向过程的,一类是面向对象的,面向对象的我们等复习完面向对象再介绍,现在先介绍 ...
- 混沌数学之Henon模型
相关DEMO参见:混沌数学之离散点集图形DEMO 相关代码: // http://wenku.baidu.com/view/d51372a60029bd64783e2cc0.html?re=view ...
- Informatica 常用组件Lookup缓存之五 使用动态查找高速缓存
对于关系查找,当目标表也是查找表时,可能要配置转换以使用动态高速缓存.PowerCenter 将在处理第一个查找请求时创建高速缓存.它将根据查找条件为传递给转换的每行查询高速缓存.当您使用动态高速缓存 ...