当中断被关闭(俗称关中断)了,CPU就不能响应其他事件,如果这时有一个鼠标中断,要在下一次开中断时才能响应这个鼠标中断,这段延迟称为中断延迟。向current_tracer文件中写入irqoff字符串即可打开offirq来跟中中断延迟。
# cd /sys/kernel/debug/tracing/
# echo 0 > options/function-trace //关闭function-trace 可以减少一些延迟
# echo irqoff > current_tracer
# echo 1 > tracing_on
[....] //停顿一小会
# echo 0 > tracing_on
# cat trace
下面是irqoff跟踪的一个结果:
# tracer:irqoff
# irqoff latency trace v1.1.5 on 4.0.0
--------------------------------------
# latency:259 us,#4/4,CPU#2 | (M:preempt VP:0, KP:0, SP:0 HP:0 #P:4)
-----------------
# | task : ps-6143 (uid:0 nice:0 policy:0 rt_prio:0)
------------------------------------------------------
# =>start at: __lock_task_sighand
# => ended at : _raw_spin_unlock_irqrestore
#
# _-------------=> CPU
# /_------------=> irqs-off
# |/_------------=> need-resched
# ||/_------------=> hardirq/softirq
# |||/_------------=> preempt-depth
# ||||/_------------=> delay
#
# cmd pid time caller
| | | |
ps-6143 2d... 0us!: tarce_hardirqs_off <-__lock_task_sighand
ps-6143 2d...1 259us+: tarce_hardirqs_on <- _raw_spin_unlock_irqrestore
ps-6143 2d...1 263us+: time_hardirqs_on <- _raw_spin_unlock_irqrestore
ps-6143 2d...1 360us: <stack trace>
# => trace_hardirqs_on_caller
# => trace_hardirqs_on
# => _raw_spin_unlock_irqrestore
# => do_task_stat
# => proc_tgid_stat
# => proc_single_show
# => seq_read
# => vfs_read
# => sys_read
# => system_call_fastpatch
文件的开头显示了当前跟踪器位irqoff并且显示当前跟踪器的版本号为v1.1.5 ,内核版本4.0。显示当前最大的中断延迟是259us,跟踪条目和总共跟踪条目为4条(#4/4),另外VP,KP,SP,HP值暂时没用到,#P:4表示系统当前可用的CPU个数。task:ps-6143表示当前发生中断的进程PID为6143的进程,命令名称是ps。
started at 和ended at显示发生中断的开始函数和结束函数分别为:__lock_task_sighand和 _raw_spin_unlock_irqrestore。接下来ftrace信息表示的内容如下:
cmd:进程的名字为ps
pid:进程的pid号
CPU#:该进程运行在哪个CPU上
irqs-off :"d" 表示中断已关闭
need_resched: "N" 表示进程设置了TIF_NEED_RESCHED和PREEMPT_NEED_RESCHED标志位;
"n" 表示进程仅设置了TIF_NEED_RESCHED标志位;
"p" 表示进程仅设置了PREEMPT_NEED_RESCHED标志位;
hardirq/softirq: "H" 表示再一次软中断中发生了一个硬件中断;
"h" 表示硬件中断
"s" 表示软件中断
"." 表示没有发生中断
preempt_depth: 表示抢占中断嵌套等级
time:表示时间戳;如果打开latency-format选项,表示事件从开始跟踪算起,这时一个相对时间,方便开发者观察,否则使用系统绝对时间开始计算
delay: 用一些特殊符号来延迟的时间,方便开发者观察。
"$" : 表示大于1s
"#" : 表示大于1000毫秒
"!" : 表示大于100毫秒
"+" : 表示大于10毫秒
最后说明的是,文件最开始显示的中断延迟是259us,但是在<stack trace>里显示的是306us,这时因为在记录最大延迟信息时需要花费一些时间。所以参考文件最开始的时间即可。