Kernel trace tools(一):中断和软中断关闭时间过长问题追踪(1)

  • Keep preemption disabled until we are done with

  • softirq processing:

*/

preempt_count_sub(cnt - 1);

if (unlikely(!in_interrupt() && local_softirq_pending())) {

do_softirq();

}

preempt_count_dec();

}

我们可以看到如果有 softirq pending 的话,do_softirq()会负责在当前进程上下文处理 softirq。并其他抢占是关闭的状态。所以我们不会调度出去,并且调用 local_bh_enable() 会立刻响应普通定时器 timer。所以这也满足以上条件。

6. softirq 的特殊

===============

我先回忆下触发 softirq 的执行场景。一共会有 3 个地方。

  • irq_exit()

  • local_bh_enable()

  • ksoftirqd 进程

当中断返回时会检查 softirq pending,这是大部分执行 softirq 的场景,由于中断的特殊性,在 timer handle 里面记录当前 CPU 的栈是有效的。local_bh_enable()的情况上面已经讨论,可以抓住元凶。但是第 3 种情况下,却不能。这是为什么呢?我们是在 timer handle 里面记录堆栈信息,如果 irq_exit 时 softirq 执行时间过长,会被安排到 ksoftirqd 进程执行。那我们记录的栈信息是什么?仅仅是 ksoftirqd 进程的栈,ksoftirq 并不是元凶。记录是没有用的。所以针对 ksoftirqd 执行的场景,我们需要特殊的处理。我们借助 hrtimer handle。hrtimer 除了测量两次 hardirq 间隔外,还测量 softirq 多长时间没有执行,在合适的时候记录栈。hrtimer 执行的时候,顺便会检测 softirqirq 多长时间没有更新时间戳,如果操作阈值我们也会记录栈信息,这是因为后续如果 softirq 被推迟到 ksoftirqd 进程执行的话,由 softirq 的 timer 记录的栈就没有价值了。

7. 如何安装

========

安装 trace-irqoff 工具很简单,git clone 代码后执行如下命令即可安装。

make -j8

make install

8. 如何使用

========

安装 trace-irqoff 工具成功后。会创建如下 /proc/trace_irqoff 目录。

root@n18-061-206:/proc/trace_irqoff# ls

distribute enable sampling_period trace_latency

/proc/trace_irqoff 目录下存在 4 个文件,分别:distribute, enable, sampling_period 和 trace_latency。工具安装后,默认是关闭状态,我们需要手动打开 trace。

8.1 打开 trace

echo 1 > /proc/trace_irqoff/enable

8.2 关闭 trace

echo 0 > /proc/trace_irqoff/enable

8.3 设置 trace
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值