测量中断的延迟

Linux的进程会由于各种原因发生运行延迟。使用ftrace的延迟追踪器有时也可以找到调度延迟的原因。

在ftrace的插件追踪器中,irqsoff、preemptoff、preemptirqsoff、wakeup、wakeup-rt分别为测量中断、优先权、调度的延迟时间的功能,统称为延迟追踪器(Latency Tracer)。(各自的内容请参考Hack#67的表8-8)。

之所以开发ftrace,是因为在开发实时内核(实际上是尽量缩短处理延迟的软实时(soft realtime)内核)时,出现了测量内核中的延迟时间、调查瓶颈在哪里的要求。这些延迟追踪器就是为了满足这个要求而开发的功能。

延迟追踪器测量的对象不同,但输出基本上是相同的。这里使用追踪禁止中断时间的追踪器作为示例。

测量中断的延迟 - 图1


notify-o-2227 0d……1us:deactivate_task<-schedule

notify-o-2227 0d……1us:dequeue_task<-deactivate_task

notify-o-2227 0d……2us:update_rq_clock<-dequeue_task

notify-o-2227 0d……3us:dequeue_task_fair<-dequeue_task

notify-o-2227 0d……3us:update_curr<-dequeue_task_fair

notify-o-2227 0d……4us:cpuacct_charge<-update_curr

notify-o-2227 0d……4us:clear_buddies<-dequeue_task_fair

notify-o-2227 0d……5us:update_cfs_load<-dequeue_task_fair

notify-o-2227 0d……6us:update_cfs_shares<-dequeue_task_fair

……

notify-o-2227 0d……219us:native_load_sp0<-__switch_to

notify-o-2227 0d……219us:native_load_tls<-__switch_to

notify-o-2227 0d……220us:native_read_cr0<-__switch_to

notify-o-2227 0d……220us:native_write_cr0<-__switch_to

docky-2157 0d……221us:finish_task_switch<-schedule

docky-2157 0d……222us:finish_task_switch<-schedule

docky-2157 0d……223us:trace_hardirqs_on<-schedule

docky-2157 0d……223us:<stack trace>

=>finish_task_switch

=>schedule

=>schedule_hrtimeout_range_clock

=>schedule_hrtimeout_range

=>poll_schedule_timeout

=>do_sys_poll

=>sys_poll

=>system_call_fastpath


显示了禁止中断期间最长、从开始禁止中断的位置到允许中断的位置之间的执行路径。与其他追踪器的输出相似,而不同之处在于其中有6个标志,且显示的不是从记录的时间开始而是从开始禁止中断开始的延迟时间。

6个标志显示的信息分别是CPU编号、是否禁止中断(d)、是否必须重新调度对象进程(N)、是不是硬中断(h)或软中断(s)、锁定了几个优先权计数、BKL。