本文主要是介绍定位分析RCU stall问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
使用RCU_CPU_STALL_CPUTIME
=====================
在编译内核时打开CONFIG_RCU_CPU_STALL_CPUTIME=y
或者在启动参数中增加
rcupdate.rcu_cpu_stall_cputime=1
, 这样在发生RCU STALL告警时就会有下面附加信息:
rcu: hardirqs softirqs csw/systemrcu: number: 624 45 0rcu: cputime: 69 1 2425 ==> 2500(ms)
这样统计信息是在采样周期中收集的。其中number
行分别是发生stalled的cpu上的硬中断,软中断,和上下文的切换次数
cputime
行的前三列分别是硬中断,软中断和任务消耗的cpu时间,单位为ms.最后一个数字是统计的周期时间(ms).
因为用户态的任务通常不会引起RCU CPU stalls,所以任务通常是内核任务,这也是为什么只统计system cpu的原因.
采样周期如下图所示::
|<------------first timeout---------->|<-----second timeout----->||<--half timeout-->|<--half timeout-->| || |<--first period-->| || |<-----------second sampling period---------->|| | | |snapshot time point 1st-stall 2nd-stall
下面展示4种典型的场景:
- 有关闭中断后的CPU循环
rcu: hardirqs softirqs csw/systemrcu: number: 0 0 0rcu: cputime: 0 0 0 ==> 2500(ms)
因为中断被关闭,因此没有中断和上下文切换。同时cpu time是在中断处理中统计的,所以也是0.
这处场景通常还会有 "(0 ticks this GP)"
打印出来.
-
有关闭下半部后的CPU循环.
这种情况和第1种情况类似,但是硬中断和上下文切换是有统计的:
rcu: hardirqs softirqs csw/systemrcu: number: 624 0 0rcu: cputime: 49 0 2446 ==> 2500(ms)
softirqs是0说明软中断被禁用,通常通过local_bh_disable()
.
-
有关闭抢占情况下的CPU循环.
这种情况下,只有上下文切换次数为0:
rcu: hardirqs softirqs csw/systemrcu: number: 624 45 0rcu: cputime: 69 1 2425 ==> 2500(ms)
- 没有循环操作,但是有大量的硬件和软中断.
rcu: hardirqs softirqs csw/systemrcu: number: xx xx 0rcu: cputime: xx xx 0 ==> 2500(ms)
这种情况下,硬中断和软中断不为0,但是上下文切换次数和sys cpu时间为0
软中断也有可能为0,比如在硬中断处理里有cpu spinning.
如果遇到此种情况的CPU stall. 可以进一步查看/proc/interrupts或者通过代码trace每种中断,可以参考show_interrupts()
.
这篇关于定位分析RCU stall问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!