SMP中断负载均衡问题讨论

100 views
Skip to first unread message

fbwww

unread,
Jan 2, 2011, 10:46:35 PM1/2/11
to linux-...@zh-kernel.org

看了iqqbalance的源码,是从/proc/inetrrupts获得各CPU中断次数信息的,然后使用/proc/irq/#/smp_affinity设置中断亲和性, 可是,对于同一个irq,如果两个CPU都进入了,实际上先进入还未退出的那个(CPU1)才做了中断和软中断处理,而另外一个(CPU2)看了inprogress标志置位,仅仅设置pending 标志,立马退出,啥也没干,但是中断任务统计却把这次中断的活算成这个CPU(CPU2)了。
irqBalance这个做法在中断比较繁忙的时候只会把中断和软中断都集中到一个CPU上,TNND这个鸟问题想了很久,google了很久都没整明白!
我就怀疑2.4/2.6内核的这个处理唯一的正面的作用就是防止level中断丢失!
_______________________________________________
Linux 内核开发中文邮件列表
Linux-...@zh-kernel.org
http://zh-kernel.org/mailman/listinfo/linux-kernel
Linux 内核开发中文社区: http://zh-kernel.org

XingChao Wang

unread,
Jan 5, 2011, 7:04:41 PM1/5/11
to fbwww, linux-...@zh-kernel.org
在 2011年1月3日 上午11:46,fbwww <fbga...@163.com> 写道:
>
> 看了iqqbalance的源码,是从/proc/inetrrupts获得各CPU中断次数信息的,然后使用/proc/irq/#/smp_affinity设置中断亲和性, 可是,对于同一个irq,如果两个CPU都进入了,实际上先进入还未退出的那个(CPU1)才做了中断和软中断处理,而另外一个(CPU2)看了inprogress标志置位,仅仅设置pending 标志,立马退出,啥也没干,但是中断任务统计却把这次中断的活算成这个CPU(CPU2)了。
> irqBalance这个做法在中断比较繁忙的时候只会把中断和软中断都集中到一个CPU上,TNND这个鸟问题想了很久,google了很久都没整明白!
> 我就怀疑2.4/2.6内核的这个处理唯一的正面的作用就是防止level中断丢失!
"对于同一个irq,如果两个CPU都进入了,"
=============
这步怎么实现?

fbwww

unread,
Jan 6, 2011, 6:00:53 PM1/6/11
to XingChao Wang, linux-...@zh-kernel.org
不是内核自己非要这么实现不可,是因为可能在一个CPU没有处理完一个中断线前,该中断线又发起了一个中断,该中断由另外一个CPU处理,内核把它们做了串行化

E=MaC^2s

unread,
Jan 6, 2011, 10:57:39 PM1/6/11
to fbwww, linux-...@zh-kernel.org
google 提交了了一个补丁,关于网卡软中断分散CPU处理,这个补丁之前软中断是和CPU绑定的。

fbwww

unread,
Jan 7, 2011, 6:18:27 AM1/7/11
to E=MaC^2s, linux-...@zh-kernel.org
这个我也看到了,2.6.35已经合入,但是我说的是这之前的版本

tingwei liu

unread,
Jan 10, 2011, 1:16:34 AM1/10/11
to fbwww, linux-...@zh-kernel.org
2011/1/7 fbwww <fbga...@163.com>:
> 这个我也看到了,2.6.35已经合入,但是我说的是这之前的版本
可以在netif_receive_skb的时候添加一个多核均衡的模块。根据不同的hash值,hash到不同的cpu上来处理,从而实现软中断的负载均衡。如果要想实现硬中断的负载均衡的话,需要一个好的板子。

fbwww

unread,
Jan 10, 2011, 8:43:28 AM1/10/11
to tingwei liu, linux-...@zh-kernel.org
“根据不同的hash值,hash到不同的cpu上来处理”
这个是分发过程,这个分发是在某个CPU的硬中断处理中完成的吧。对一个报文的软中断的处理是在处理该报文的硬中断的CPU上完成的,保证cache的命中率
,但是这里报文的硬中断处理和软中断处理就可能不是同一个CPU了,这样为了避免cache失效,处理硬中断的CPU不应该做报文拷贝操作,而应该仅仅只是拷贝报文缓冲区(DMA)指针,这两点是大的变化

不知道我分析得对否

tingwei liu

unread,
Jan 10, 2011, 8:34:44 PM1/10/11
to fbwww, linux-...@zh-kernel.org
2011/1/10 fbwww <fbga...@163.com>:

> “根据不同的hash值,hash到不同的cpu上来处理”
> 这个是分发过程,这个分发是在某个CPU的硬中断处理中完成的吧。对一个报文的软中断的处理是在处理该报文的硬中断的CPU上完成的,保证cache的命中率
> ,但是这里报文的硬中断处理和软中断处理就可能不是同一个CPU了,这样为了避免cache失效,处理硬中断的CPU不应该做报文拷贝操作,而应该仅仅只是拷贝报文缓冲区(DMA)指针,这两点是大的变化
>
> 不知道我分析得对否
分发过程也可以在软中断中进行啊。
的确这样会导致cache失效。

fbwww

unread,
Jan 11, 2011, 5:59:32 AM1/11/11
to tingwei liu, linux-...@zh-kernel.org
软中断都已经对报文做处理了,要非这么做,那就软中断里不要处理报文,在软中断里把报文从CPU自己的队列摘下来放到该它处理的CPU队列里,再次触发另外一个CPU的软中断,不过这么做,要触发两次软中断,实在不好...,不知道具体google这个补丁是怎么做的

另外,触发别的CPU软中断是怎么做的,是不是使用CPU间中断

tingwei liu

unread,
Jan 12, 2011, 3:25:48 AM1/12/11
to fbwww, linux-...@zh-kernel.org
2011/1/11 fbwww <fbga...@163.com>:

> 软中断都已经对报文做处理了,要非这么做,那就软中断里不要处理报文,在软中断里把报文从CPU自己的队列摘下来放到该它处理的CPU队列里,再次触发另外一个CPU的软中断,不过这么做,要触发两次软中断,实在不好...,不知道具体google这个补丁是怎么做的
>
假设网卡是非napi的:(其实napi的跟这个差不多)
google的rps其实就是在netif_rx的时候,根据skb的不同hash,把skb挂接到对应的cpu的softnet_data->input_pkt_queue。
softnet_data多了一个结构体rps_ipi_list。如果是挂接到其他的cpu上,那么就是把其他的cpu挂接到本地cpu的rps_ipi_list中。
而在接收数据包的时候,如果rps_ipi_list不为空,那么就触发对应的cpu软中断。
> 另外,触发别的CPU软中断是怎么做的,是不是使用CPU间中断
通过在一个cpu上调用另一个cpu的函数来实现。可以看看这个函数__smp_call_function_single

fbwww

unread,
Jan 12, 2011, 8:33:57 AM1/12/11
to tingwei liu, linux-...@zh-kernel.org
netif_rx是在中断里调用的吧

tingwei liu

unread,
Jan 12, 2011, 7:59:31 PM1/12/11
to fbwww, linux-...@zh-kernel.org
2011/1/12 fbwww <fbga...@163.com>:
> netif_rx是在中断里调用的吧
Copy from the ULN:
netif_rx is usually called by a driver while in interrupt context,but
there are exceptions,notably when the function is called by the
loopback device.
Reply all
Reply to author
Forward
0 new messages