Linux 网络软中断,优化Linux网络处理性能的软中断处理机制

摘 要:软中断在Linux内核中,作为一种对时间要求最为严格的中断下半部处理机制,在处理网络数据包的过程中发挥着无可替代的作用,而软中断处理函数采用固定的循环检测次数,以至于系统可能在网络负载高的情况下对数据包不能进行及时有效处理。提出了一种最大循环检测次数可动态变化的方法来优化软中断处理机制,实验表明,相比现有的软中断机制而言,在同样的环境下可以处理更多的软中断例程,表现为捕获更多的网络数据包,提升了系统处理软中断的能力,进而在系统级上优化了Linux网络处理性能。

关键词:软中断;下半部处理机制;Linux内核;最大循环检测次数;软中断例程

中图分类号: TP393

文献标志码:A

Soft interruption handling mechanism to optimize

handling performance for Linux network

XIONG Anping,HAN Song,JIANG Yi

College of Computer Science and Technology,Chongqing University of Posts and Communications,Chongqing 400065,China

)

Abstract: As the most strict bottom half handling mechanism of interruption on time accuracy, soft interrupt mechanism plays an irreplaceable role in the process of handling network packet. However, unalterable circular check times taken by soft interruption handling function causes system unable to handle packets effectively under high traffic load. This paper presented a methodology of adaptive circular checking times to optimize soft interruption handling mechanism. Test shows that compared with the former mechanism, current soft interruption mechanism can handle more soft interruption routines in the same condition, i.e. capturing more network packets. The methodology improves the system′s capacity to handle soft interruptions and optimizes the handling capability of Linux network.

Key words: soft interruption;bottom half handling mechanism;Linux kernel;max circular checking times;soft interruption routine

0 引言

当网络中的数据包到达网络适配器时,网络适配器就会发出中断请求信号,通知系统有数据包到了。CPU需要尽快处理这一中断请求,而为了避免中断嵌套导致控制复杂化的问题,CPU在执行中断处理程序的过程中,必须禁止所有中断请求。而中断请求是一个随机事件,随时都有可能发生,当中断频繁产生,就会导致新的中断丢失。

将整个中断处理机制一分为二的思想极大地改善了系统中断处理能力。中断上半部分主要由中断处理程序对到达的中断请求进行简单应答和标记,发出中断请求的设备需要系统处理的具体工作则由中断下半部来推后完成,这样就在很大程度上避免了中断丢失。

从Linux 2.4内核开始,软中断机制就成了下半部处理机制中的一种。到现在的2.6内核,软中断更是下半部处理机制中不可或缺的一种机制了。在两种版本的内核中,软中断机制都是保留给系统中对时间要求最严格以及最重要的下半部使用的。随着吉比特甚至数十吉比特以太网时代的到来,计算机系统也要跟得上如此巨大的带宽来处理网络数据,显然,对处理时间的要求是相当的严格,因此,软中断机制应用在网络数据包的下半部处理中恰到好处。既然软中断是网络数据包的具体加工处理站,那么,通过研究软中断机制,进而在系统级上进一步提升网络处理性能成为可能。在2.4内核中,系统只能依靠软中断掩码来判断是否要继续通过循环来处理软中断例程,而在2.6内核版本中,软中断处理函数加入了最大循环检测次数的概念,让最大循环检测次数的值和软中断掩码的值相与,用得到的结果是否为真来判断是否要继续通过循环来处理软中断例程。

1 软中断机制分析

1.1 内核软中断

在Linux 2.6.18内核中,linux/interrupt.h文件中定义了软中断结构softirq_action。

程序前

struct softirq_action{

void (*action) (struct softirq_action *);//待执行的函数

void *data;//传给函数的参数

};

程序后

其中action指向softirq的处理函数,成员变量data指明了处理函数所需的参数。

文件src/kernel/softirq.c中声明了一个数组softirq_vec[32],数组中每个元素对应一个软中断项。定义如下:

程序前

static struct softirq_action softirq_vec[32] _cacheline_ aligned_in_smp;

程序后

Linux内核目前使用了32个软中断项中的6项,其中用于TCP/IP协议接收网络数据包的枚举项NET_RX_SOFTIRQ占其中之一。

1.2 软中断处理机制

软中断被__do_softirq()函数处理之前,必须先使用open_softirq()函数来注册相应softirq的处理函数和参数,然后再被__raise_softirq()函数触发,最后才满足让irq_exit()函数去检查是否满足invoke_softirq()宏定义执行的条件,接着invoke_softirq()宏定义的do_softirq()函数,再判断是否有softirq需要处理,若有,则调用__do_softirq()去循环检测待处理的软中断,进而再对softirq_vec数组中的待执行的action所指向的函数进行处理。结合中断上半部分的简要流程,整个中断处理流程大概可以通过图1来表示。由此可知,具体处理软中断的函数应该是__do_softirq(),此函数的流程如图2所示。

图片

图1软中断机制的处理流程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值