Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46470
  • 博文数量: 9
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-16 12:28
个人简介

Life is to be hacked and created

文章分类
文章存档

2013年(7)

2012年(2)

我的朋友

分类: LINUX

2013-06-15 11:48:54

这个星期,在优化整个系统的调度,保证在非常大的流量输入下,重要业务比如语音视频,也能够正常工作。
其中涉及到软中断和RT进程的调度、抢占等内容,有比较多的道道。

整个思路是借鉴这篇文章:
http://elinux.org/images/7/72/Elc2011_xi_rt.pdf
没有考虑rt patch是因为动作太大,有点大炮打蚊子的味道。

我们知道,转发业务有NET_RX/NET_TX两个softirq处理,优先级非常高,可以抢占应用进程和内核线程,且只能被硬中断打断。但是语音视频业务,有内核线程,也有用户进程。
得把他们拉到同一水平上,这就是软中断“线程化”。原生内核也有机制,当软中断过多,就会开启ksoftirqd进行处理,即线程化。
线程化之后,就可以设定为rt进程,调整优先级,由调度器保证严格优先级调度,也可以实现抢占。

首先,进入softirq处理时,检查被打断的是否为rt进程。如果是,退出软中断,由调度器调度ksoftirqd进行软中断处理。这样基本上保证rt进程不会被软中断打断。

然后,因为softirq是默认禁止抢占的,所以做些fix,保证其他业务能抢占ksoftirqd。
可以在restart softirq处理之前,检查need_resched,如果需要reschedule,就退出restart。减少抢占延时。

做了这两个动作后,还是存在抢占延时,因为一次NET_RX softirq处理,默认最大可能处理300个报文,如果这个延时无法接受,可以在net_rx_action中主动检查need_resched,退出处理。
阅读(2531) | 评论(0) | 转发(0) |
0

上一篇:Kindle电子书阅读体验

下一篇:没有了

给主人留下些什么吧!~~