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中断读取机器系 ...
随机推荐
- amfphp2.1.1的使用经过
这两天看了一个FLASH的教程,是arrowyong写的名为 <<ActionScript3.0从零基础学习类>>,这个教程好用,没有ActionScript编程经验的人,可以 ...
- symbol(s) not found for architecture armv7
Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ...
- 正则表达式校验15/18位生份证-JAVA版
public static boolean isIDNumber(String iDNumber) { if (iDNumber == null || "".equals(iDNu ...
- 算法:非平衡二叉搜索树(UnBalanced Binary Search Tree)
背景 很多场景下都需要将元素存储到已排序的集合中.用数组来存储,搜索效率非常高: O(log n),但是插入效率比较低:O(n).用链表来存储,插入效率和搜索效率都比较低:O(n).如何能提供插入和搜 ...
- shader内置变量
内置变量都在UnityShaderVariables.cginc文件中声明 变换矩阵 All these matrices arefloat4x4 type. Name Value UNITY_MAT ...
- Android之MVC——Model通知View去更新(实用)
下面两段标红加深的代码是重点: import android.app.Activity; import android.os.Bundle; import android.view.View; imp ...
- Android布局优化之ViewStub、include、merge使用与源码分析
在开发中UI布局是我们都会遇到的问题,随着UI越来越多,布局的重复性.复杂度也会随之增长.Android官方给了几个优化的方法,但是网络上的资料基本上都是对官方资料的翻译,这些资料都特别的简单,经常会 ...
- UTF-8,Unicode,GBK,希腊字母读法,ASCII码表,HTTP错误码,URL编码表,HTML特殊字符,汉字编码简明对照表
UNICODE,GBK,UTF-8区别 UNICODE,GBK,UTF-8区别 简单来说,unicode,gbk和大五码就是编码的值,而utf-8,uft-16之类就是这个值的表现形式.而前面那 ...
- C语言:创建动态单向链表,创建完成后,输出每一个节点的数据信息。
// // main.c // dynamic_link_list // // Created by ma c on 15/8/5. // Copyright (c) 2015. All ri ...
- OpenCV学习(39) OpenCV中的LBP图像
本章我们学习LBP图像的原理和使用,因为接下来教程我们要使用LBP图像的直方图来进行脸部识别. 参考资料: http://docs.opencv.org/modules/contrib/doc/fac ...