libbpf-tools/hardirqs
统计各类型硬中断消耗时间
# /usr/share/bcc/libbpf-tools/hardirqs
Tracing hard irq event time... Hit Ctrl-C to end.
^C
HARDIRQ TOTAL_usecs
ens32 124
vmwgfx 65
ioc0 854
ata_piix 463
部分类型的中断处理分上半部和下半部,如网络,网络硬中断只负责唤醒软中断,硬中断只会耗时非常短。
部分类型的中断处理和cpu数量成倍关系。
原理
在irq_handler_entry
追踪点记录时间开始,在irq_handler_exit
追踪点记录时间差
场景
硬中断的开销和硬件、负载相关,如果CPU过多时间消耗在硬中断应检查是否异常。
/proc/status
中有开销更小的实时检测硬中断耗时的工具(使用定时器定时检查,可能因定时器频率问题误差)。
参考
tools/llcstat
统计任务cache miss
,缓存命中率,
# tools/llcstat 20 -c 5000
Running for 20 seconds or hit Ctrl-C to end.
PID NAME CPU REFERENCE MISS HIT%
0 swapper/15 15 3515000 640000 81.79%
238 migration/38 38 5000 0 100.00%
4512 ntpd 11 5000 0 100.00%
150867 ipmitool 3 25000 5000 80.00%
150895 lscpu 17 280000 25000 91.07%
151807 ipmitool 15 15000 5000 66.67%
150757 awk 2 15000 5000 66.67%
151213 chef-client 5 1770000 240000 86.44%
151822 scribe-dispatch 12 15000 0 100.00%
123386 mysqld 5 5000 0 100.00%
[...]
Total References: 518920000 Total Misses: 90265000 Hit Rate: 82.61%
- 该数据由CPU的PMU性能计数器提供,虚拟机机器中可能不含有性能计数器。
- 性能计数器触发频率较高,可能有额外的性能开销
- 不同架构的PMU提供的“缓存”代指的区域可能不一样。
原理
在perf硬件事件中捕获,统计引用和缓存未命中。
bcc/libbpf-tools/llcstat.c: 234
if (open_and_attach_perf_event(PERF_COUNT_HW_CACHE_MISSES,
env.sample_period,
obj->progs.on_cache_miss, mlinks))
goto cleanup;
if (open_and_attach_perf_event(PERF_COUNT_HW_CACHE_REFERENCES,
env.sample_period,
obj->progs.on_cache_ref, rlinks))
场景
较高的缓存命中率代表缓存“热”,可以有效减少内存的读取频率,缓存速度比内存快。程序经常访问随机内存或频繁迁移CPU可能导致缓存命中率较低。通常业务负载保值一致时缓存应保持较高的数值可提升性能表现。
参考
libbpf-tools/softirqs
# /usr/share/bcc/libbpf-tools/softirqs
Tracing soft irq event time... Hit Ctrl-C to end.
^C
SOFTIRQ TOTAL_usecs
timer 1114
net_tx 1
net_rx 225
block 61
sched 872
rcu 853
原理
部分类型的硬件中断事件不能在硬件中断中及时完成,所以一些中断被设计为部分在硬中断中完成(上半部)部分在内核任务软中断中完成(下半部)。如网络类型的硬中断回调仅仅是标记对应的事件唤醒软中断,主要的网络事件均在软中断中完成。
linux-5.10.202/include/linux/interrupt.h: 531
enum
{
HI_SOFTIRQ=0,
TIMER_SOFTIRQ,
NET_TX_SOFTIRQ,
NET_RX_SOFTIRQ,
BLOCK_SOFTIRQ,
IRQ_POLL_SOFTIRQ,
TASKLET_SOFTIRQ,
SCHED_SOFTIRQ,
HRTIMER_SOFTIRQ,
RCU_SOFTIRQ, /* Preferable RCU should always be the last softirq *
软中断是内核态中的常规任务,命名为ksoftirqd/<cpu id>
,可在任务管理器中看到,该任务的主要工作是循环执行__do_softirq
函数根据当前的软中断事件调用对应的软中断回调。
linux-5.10.202/kernel/softirq.c: 255
asmlinkage __visible void __softirq_entry __do_softirq(void)
while ((softirq_bit = ffs(pending))) {
trace_softirq_entry(vec_nr);
h->action(h);
trace_softirq_exit(vec_nr);
softirqs
工具统计软中断回调事件h->action(h)
的耗时,在softirq_entry
跟踪点中开始计时,在softirq_exit
跟踪点中记录时间差并计算时间总和。
场景
不同于/proc/stat
中根据cpu定时采样获取的软中断耗时,/proc/stat
因为定时采样原因有可能有误差,且统计的是整个软中断任务的cpu消耗,而softirqs
排除了定时中断的影响、软中断任务非软中断回调的影响,统计更准确。