软中断网卡处理Linux高性能外部设备处理机制SMP
Jack:Linux外部设备的性能如何才能高呢?
我:你为什么希望外部设备的性能好呢?
Jack:典型的说,外部设备如磁盘、网卡都需要非常好的性能。磁盘设备处理性能好,才能承载数据库系统。网卡性能好,才能承载高性能server(数据库或者web server)。
我:那你觉得用什么样的方式处理这两个外部设备,它的性能会好呢?
Jack:外部设备要好,当然应该采用中断方式,这是性能最高的。
我:你错了。外部设备与CPU的交互方式,最快的是DMA。但是,DMA方式会使外部设备的控制器独占PCI总线,从而CPU无法与外部设备进行交互——这对通用型操作系统来说,是很难接受的。所以DMA方式,在Linux内核里使用得很少。Linux笔记是一个通用型操作系统,而非专用型嵌入式操作系统。
Jack:说了这么多,还是要用中断才行。
我:是的。但是中断仅仅是最基本的方式。使用中断这种外部设备处理方式,有两个硬伤需要面对:
1、丢失中断问题:在中断响应代码里,一般都会调用cli()宏定义关闭中断,当中断完成之后,再调用sti()宏定义打开中断。如果中断响应代码执行时间比较长(毫秒级别),那么在这段时间内,中断都无法响应——这对于一个server操作系统来说,是无法接受的。
2、SMP均衡问题:在SMP下,常用的中断默认只会落到CPU0上去,其余的CPU无法处理中断,这对整个操作系统的可扩展性来说,是致命的。
这两个问题对所有外部设备都适用,如果外部设备对性能要求非常之高,那么,这两个问题一定要解决。
Jack:常见的对性能要求非常之高的外部设备有哪些呢?
我:最常见的是网卡设备和磁盘设备。其中,对于网卡设备而言,这两个问题尤其棘手。
Jack:对于网卡设备而言,这两个问题是怎么解决的呢?
我:对于中断丢失的问题,Linux内核早期采用了BH的机制。而对于SMP的问题,Linux内核至今没有完美的解决办法。当然,这并不是说就没有解决的办法,只是有些互联网公司没把核心技术开源出来而已。
Jack:BH机制是怎么回事呢?
我:BH是bottom half的缩写,但是BH已经是一个专有名词,代表最早的Linux内核的bottom half机制,而bottom half是一个通用名词。Linux内核从程序猿的角度把中断响应程序分为两部分——上半部、下半部。上半部做标记功能用,下半部根据上半部的标记干活。上半部与下半部的本质区别是,上半部可以关闭中断,而下半部不能关闭中断。所以,bottom half的概念,完全是hacker意淫出来的,并非是CPU层面的概念。
Jack:那BH这种意淫出来的机制的好处在哪里呢?
我:这种机制的优点在于解决了第一个问题——丢失中断。通过把上半部极致地浓缩,可以最大限度地减少关闭中断的时间,从而减少中断丢失——没有绝对的不丢失中断,只能最大限度地减少中断丢失。
Jack:那BH机制的缺点是什么呢?
我:这个问题问得很好,不仅问了有点是什么,同时问了缺点是什么。两个点你都弄清楚了,差不多就高潮了。
Jack:去死吧。
我:BH机制的缺点在于无法解决第二个问题。就是BH机制在SMP下,表现得太龊逼了。
Jack:仔细一点呢?
我:BH硬编码定义了32类Bottom half,这32类botton half在同一时刻只能执行其中一种,即便是在SMP环境下,也是如此。所以,BH机制是绝对的串行化,而没有任何并发能力。
Jack:绝对的串行化也很好,实现非常简单,只是无法发挥多核的优势。
我:这种说法等于上馆子吃饭只喝水不点菜、不叫饭,因为这样省钱。但是这样的做法,是SB的。
Jack:那么Linux在处理外部设备的性能问题上,如何解决SMP的呢?
我:在Linux2.6版本内核里,提供了3种成熟的方法来解决外设与SMP配合的问题:软中断、tasklet、工作队列。其中,软中断是一种全新的机制,具备在SMP下软中断类型间的并发甚至是同种软中断内的并发能力。tasklet建立在软中断之上,是软中断的一种特例,相比于软中断,tasklet不具备同种软中断内的并发能力。对于除磁盘设备、网卡设备而言,几乎所有的外部设备用tasklet就够了。只有极少数的外部设备需要自己定制软中断。当然了,软中断的定制不是那么简单的。且不说需要对软中断的原理、实现代码非常熟悉。更难的是,需要自己实现软中断在SMP下,同种软中断内部间的互斥与同步。如果采用简单粗暴的spinlock,那么软中断在性能上就已经失去意义。而采用别的数据结构实现数据同步与互斥,又具备相当大的难度,所以,即便是Linux内核的官方版本,对这个问题也是极为头疼。至于第三种——工作队列。这种机制与前两种机制的最大差别在于,这种机制的bottom half会通过内核线程进入休眠,之后被唤醒。这里有两个难点,第一点是,休眠会引起上下文切换(context switch),对性能具有极大的杀伤。第二点是,Linux内核作者是非常反对user创建内核线程的——原因不言而喻,Linux内核是内核作者写好对外提供服务的,你一来就动大手术,把内核改造了,加了线程,谁能保证在某种情况下不出现问题呢?出了问题之后,会找谁解决呢?一般人当然首先先到内核作者。可是,当你找到内核作者的时候,情形好比是你把一台刚买的笔记本用螺丝刀打开过了,还下了几个零件,然后电脑坏了,你对售后服务说“我的电脑坏了,你帮我修理下。”
软中断网卡处理Linux高性能外部设备处理机制SMP相关推荐
- 高性能异步IO机制:IO_URING
高性能异步IO机制:IO_URING 一.前言 1.1 异步IO机制 Linux内核提供的IO机制大都是同步实现的,如常规的read/write/send/recv等系统调用.同步IO机制存在着一定的 ...
- 《Linux高性能服务器编程》学习笔记
<Linux高性能服务器编程>学习笔记 Linux高性能服务器编程 TCP/IP协议族 TCP/IP协议族体系结构以及主要协议 数据链路层 网络层 传输层 应用层 封装 分用 测试网络 A ...
- Linux 高性能服务器开发笔记:Reactor 模型定时器 | 网络编程定时器
本文主要根据游双书本 Linux 高性能服务器开发 学习分析 linux 网络编程常用到的定时器模型,配备详细理解和分析,同时分析了 Linux 内核中定时器的低精度时间轮和高精度定时器实现思路还有 ...
- Linux内核抢占实现机制分析【转】
Linux内核抢占实现机制分析 转自:http://blog.chinaunix.net/uid-24227137-id-3050754.html [摘要]本文详解了Linux内核抢占实现机制.首先介 ...
- 《Linux高性能服务器编程》——导读
前 言 为什么要写这本书 目前国内计算机书籍的一个明显弊病就是内容宽泛而空洞.很多书籍长篇大论,恨不得囊括所有最新的技术,但连一个最基本的技术细节也无法解释清楚.有些书籍给读者展现的是网络上随处可见的 ...
- linux 信号没有被处理方法,[计算机]Linux 信号signal处理机制.doc
[计算机]Linux 信号signal处理机制 Linux 信号signal处理机制 信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念.Linux对信号机制的大致实现方法.如何使 ...
- Linux内核的Softirq机制
前言 中断服务程序往往都是在CPU关中断的条件下执行的,以避免中断嵌套而使控制复杂化.但是CPU关中断的时间不能太长,否则容易丢失中断信号.为此,Linux将中断服务程序一分为二,各称作" ...
- 哪些是Linux内核的同步机制,Linux内核的同步机制(1)
Linux内核的同步机制(1) yanqin | 2009-04-16 14:51:09 阅读:791 发布文章 一. 引言 %A %A 在现代操作系统里,同一时间可能有多个内核执行流在执行,因 ...
- 大话Linux内核中锁机制之原子操作、自旋锁【转】
转自:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实 ...
最新文章
- OpenCV中Mat数据结构使用举例
- 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...
- 图像的评价指标之PSNR——峰值信噪比
- QDir::toNativeSeparators的使用
- Object类-try-catch-finally-throw-throws-自定义异常
- 学会这些套路和用词,Discussion不愁没思路
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
- WTM框架使用技巧之:Layui版本嫁接Vue+ElementUI
- erp系统开源_自行构建的开源ERP系统
- java 皮尔逊相关系数_皮尔逊相关系数
- 手机充电全部用完充好还是有空就充好?
- EMOS邮件系统安装(光盘安装版)
- python3实现图片虚化显示轮廓
- GAN的后门攻击:The Devil is in the GAN: Defending Deep Generative Models Against Backdoor Attacks
- python中save是什么意思_Python中的numpy.save()和joblib.dump()有什么区别?
- WiFi认证过程需要的协议和服务
- 数据恢复工具有哪些? 十个最好的数据恢复软件
- 2014科技十大名词——如果之前你不知道,证明你是行外人,如果你只是听说,证明你只是是爱好者
- 统计文章单词频数(C语言)
- 虚拟化 半虚拟化 全虚拟化_我的虚拟实习经历
热门文章
- 安装mysql后环境变量_环境变量配置2 安装mysql
- 自动化测试——接口自动化——requests用法
- 在python的解释器中使用函数_浅析Windows 嵌入python解释器的过程
- appinventor贪吃蛇制作步骤_旋转RGB制作指导
- ipv6地址在线计算_关于IPv6的八个浅言问答
- 汉语言文学专业c学校,哪个学校汉语言文学专业最好?有哪些录取要求最低分数线是多少?...
- C语言从链表中删除素数,Data Structures 之 链表
- php检测是否存在敏感词,如何用PHP+Ajax判断是否有敏感词汇
- python sftp连接_Python 脚本:创建SFTP连接传输数据
- hand keypoint detection in single images using multiview bootstrapping