基于Linux的家庭网关优化

发布时间:2010-11-29 阅读量:2053 来源: 发布人:

【中心议题】

  • 提出了一种改善家庭网关性能的思路
  • 给出了关键代码

【解决方案】

  • Linux内核相应报文处理函数做以修改
  • 使报文处理流程处于中断和轮询相互切换的工作模式

随着社会信息化和家庭网络化的飞速发展,越来越多的家庭建立了家庭网络。家庭网关是整个家庭网络的核心,它主要实现Internet接入、远程控制以及连接家庭内部异构子网的功能。家庭网关类似于服务器的功能,集中控制家庭网络中的家电设备,如信息家电、安防系统、报警系统等。在基于Linux网络中,通过Linux驱动程序的形式连接各个模块和操作系统,完成整个软件的构架, CPU总控模块负责初始化和协调各个模块的操作,是整个系统的大脑,事务控制模块支持并发控制,主要保证传递过程中的可靠性和高效性。

1 数据报文处理过程及其缺陷

当网络适配器正确接收到一个数据包时,会触发一个中断,其驱动程序中的中断服务程序将调用确定的接收函数来处理,将收到的网络包放到网络接收队列上,并设置相应状态寄存器,系统会在中断处理返回时,处理发生的软中断,如图1所示。根据状态寄存器就会判断是否接收到了新包、是否完成了传输或是否发生了错误。如果接收到了包,就会调用net_rx()中断处理函数,处理接收包的驱动程序方法负责请求套接字缓冲区并把接收到的包填充到包数据空间中。随后, netif_rx()可以将套接字缓冲区放入输入队列中,最后网络设备的统计信息被更新,并且中断处理程序可以继续处理下一个收到的包也可以终止中断处理。

 

当网络适配器驱动程序执行到netif_rx(),将收到的网络包放到网络接收对列上,同时设置相应中断标志,系统在中断处理返回时,根据标志位信息处理发生的中断,调用对应注册过的net_rx_ac-tion()函数取下网络包,进一步调用对应的处理函数ip_rcv(),对网络包进行路由并转发,最后由dev_queue_xmit()负责将包从对应的出口设备上发送出去,或者在队列忙时将包放入设备发送队列并设置相应网络发送中断,等待中断处理机制推迟发送网络包。

基于Linux网关中转发报文流程执行比较频繁,对系统的效率影响最大。工作在中断模式下的网络适配器,在网络负载比较大的情况下,网络部分的接口会频繁地中断系统,从而造成非常大的系统负载。当网络流量非常大时,在中断级别上处理网络请求的操作系统将会陷入中断影响之中,最终导致报文吞吐率急剧下降。当带宽占用率相同,全部传输短报文的情况下,由于中断非常频繁,系统的峰值处理能力将达到最低限度。

2 基于中断和轮询自动切换的传输机制

为了解决中断驱动模式带来的负面影响,现在提出一种中断和轮询自动切换的报文处理模式。在网络负载较低的情况下,报文到达时间是不可预测的,所以由于报文到达的随机性会产生系统延迟,此时利用中断处理机制能够很好地避免大量延迟产生;但是当网络负载比较高时,报文的输入速率会达到一个基本的稳定状态,如果采用中断处理机制,由于高负荷的网络会带来频繁的中断发生,从而降低系统效率,此时采用轮询机制反而会充分发挥其优势,保证系统的高吞吐率。

具体工作过程如下(工作流程如图2所示):

(1)当报文首次到达时,系统处于开中断状态,此时通过修改标志寄存器的中断允许位使系统处于关中断状态,从而进入轮询模式,同时给滑动窗口W配置一个用于判断每次轮询所接收到的数据报文的个数n;

(2)n,报文输入速率达到或接近系统的饱和状态,此时继续处于关中断状态,系统任然保持轮询机制;

(3)nW,报文输入速率比较低,系统有可能进入空轮询状态,为了降低系统开销,修改标志寄存器相应位,使系统由关中断进入开中断状态,重新打开中断,以中断的方式处理报文;

(4)当前报文处理完毕,接收到下一个报文时,

 

重复(1)(2)(3)。如果接收队列未满但系统资源耗尽后,进入初始化状态,释放所有资源。

在轮询工作模式下,为了避免引发外部中断,需要屏蔽“接收成功”、“发送成功”等内部中断,同时不断查询这些中断状态位的情况,发现需要处理的内部中断时做以相应处理,当中断工作模式回复后,相应要重新恢复刚才屏蔽掉的“接收成功”、“发送成功”等内部中断。

当网络适配器进入轮询状态时,软件中断NET_RX_SOFTIRQ的处理例程net_rx_action()最终将调用dev_queue_xmit()发送函数, dev_queue_xmit()的调用流程是: dev_queue_xmit()-->qdisc_run()-->qdisc_restart(),调用方法qbisc_restart()以启动网络设备数据包的传输,而此时它有可能在设备发送队列繁忙时引发网络发送中断:

在数据包放入队列之后,调用qdisc_run()来发送数据包:

static inline void qdisc_run(structnet_device* dev)

{

 while (! netif_queue_stopped(dev) &&

    qdisc_restart(dev)<0)

  /* NOTHING* /;

}

qdisc_restart()函数中,首先调用函数pfifo_fast_dequeue()从队列中取出一个数据包,然后调用网络适配器驱动的发送函数dev->hard_start_xmit()发送数据包,如果发送失败,则需要将这个数据包重新压入队列pfifo_fast_requeue,然后启动协议栈的发送软中断进行再次的发送,从而引发软处理中断。

为了保证轮询工作正常进行,需要做以修改。linux-2. 6. 14. 1qdisc( )函数部分源码如下。

int qdisc_restart(structnet_device* dev)

{

 structQdisc* q = dev->qdisc;

 struct sk_buff* skb;

requeue:

  q->ops->requeue(skb, q);

  netif_schedule(dev);

  return 1;

 }

 BUG_ON(( int) q->q. qlen < 0);

 return q->q. qlen;

}

以下是修改后的函数部分代码:

int qdisc_restart(structnet_device* dev)

{

    If(! config_polling_on)

  netif_schedule(dev);

}

其中config_polling_on指示当前是否是轮询工作模式,/proc下保留了设置它的接口,方便动态地设置。

修改后,当打开轮询内核设置后, qdisc_restart()就不再进行网络层的发送软中断调度,从而保证了轮询正常进行。

3 总结

综上所述,通过编写简单的控制程序,Linux内核相应报文处理函数做以修改,就可以使报文处理流程处于中断和轮询相互切换的工作模式,大大提高了系统的处理能力。

相关资讯
全闪存与软件定义双轮驱动——中国存储产业年度趋势报告

根据IDC最新发布的企业级存储市场追踪数据,2024年中国存储产业迎来结构性增长拐点。全年市场规模达69.2亿美元,在全球市场占比提升至22%,展现出强劲复苏态势。以浪潮信息为代表的国内厂商持续突破,在销售额(10.9%)和出货量(11.2%)两大核心指标上均跻身市场前两强,标志着本土存储生态的成熟度显著提升。

索尼启动半导体业务战略重组 图像传感器龙头或迎资本化新篇章

全球消费电子巨头索尼集团近期被曝正酝酿重大战略调整。据彭博社援引多位知情人士透露,该集团拟对旗下核心半导体资产——索尼半导体解决方案公司(SSS)实施部分分拆,计划于2023年内推动该子公司在东京证券交易所独立IPO。该决策标志着索尼在半导体产业布局进入新阶段,同时也预示着全球图像传感器市场格局或将发生重要变化。

革新智能驾驶通信:移远车载蜂窝天线补偿器如何破解行业痛点?

在2025上海国际车展上,移远通信推出的全新车载蜂窝天线补偿器引发行业关注。该产品通过双向动态补偿、微秒级频段切换及混频电路集成等核心技术,解决了车载通信中长期存在的射频链路损耗难题,为智能网联汽车提供稳定高效的通信支持。本文将从技术优势、竞争分析、应用场景及市场前景等多维度解读这一创新方案。

全球DRAM市场变局:三星技术迭代与SK海力士堆叠方案的对决

在全球DRAM市场格局加速重构的背景下,三星电子近期宣布将跳过第八代1e nm工艺节点,转而集中资源开发基于垂直通道晶体管(VCT)架构的下一代DRAM技术。据内部路线图显示,三星计划在2027年前实现VCT DRAM量产,较原定计划提前一个世代。该技术通过三维堆叠晶体管结构,将存储单元面积缩减30%,并利用双晶圆混合键合工艺解决信号干扰问题,被视为突破传统平面工艺物理极限的核心方案。

京东方2025年一季度净利润飙升64% 显示业务领跑全球推动业绩新高

2025年4月28日,京东方科技集团股份有限公司(以下简称“京东方”)发布2025年第一季度财报,以多项核心经营指标的历史性突破,彰显其作为全球半导体显示龙头企业的强劲发展动能。报告期内,公司实现营业收入505.99亿元,同比增长10.27%,创下一季度收入新高;归属于上市公司股东的净利润达16.14亿元,同比大幅增长64.06%,扣非净利润13.52亿元,同比飙升126.56%。这一业绩表现得益于其“屏之物联”战略的深化落地,以及“1+4+N+生态链”业务架构下各板块的协同创新。