一,工具简介
runqslower工具显示了任务准备运行与之后在CPU上运行之间的高延迟调度时间。
该工具需要Linux 4.9+(支持BPF_PROG_TYPE_PERF_EVENT)。
二,代码示例
此脚本统计任务在运行队列中等待在CPU上运行的时间,并将此时间显示为单个事件。这个时间应该很短,但由于CPU负载,任务可能需要等待其轮次。
此脚本会统计两种类型的运行队列延迟:
1. 从任务进入运行队列到其上下文切换和执行的时间。
这通过追踪ttwu_do_wakeup()、wake_up_new_task()到finish_task_switch()的过程,
使用原始跟踪点(如果支持)或kprobes,并在自愿上下文切换后统计运行队列的延迟。
2. 从任务被非自愿上下文切换但仍处于可运行状态,到其下一次执行的时间。
这仅通过finish_task_switch()进行统计。
#!/usr/bin/env python
from __future__ import print_function
from bcc import BPF
import argparse
from time import strftime
# arguments
examples = """examples:
./runqslower # trace run queue latency higher than 10000 us (default)
./runqslower 1000 # trace run queue latency higher than 1000 us
./runqslower -p 123 # trace pid 123
./runqslower -t 123 # trace tid 123 (us