这是另一个分析工具,perf,得知v2.12.0版本引发CPU死循环的关键函数为sk_run_filter
Samples: 33K of event 'cycles', Event count (approx.): 5778034374
Children Self Command Shared Object Symbol
+ 85.76% 0.00% bitcometd [unknown] [k] 0x0000000000000017
+ 84.70% 0.00% bitcometd libc-2.31.so [.] 0x00007f8c6799d68e
+ 70.81% 0.15% bitcometd [kernel.kallsyms] [k] tracesys
+ 66.68% 0.36% bitcometd [kernel.kallsyms] [k] syscall_trace_enter
+ 65.62% 0.56% bitcometd [kernel.kallsyms] [k] __secure_computing
+ 64.84% 0.55% bitcometd [kernel.kallsyms] [k] __seccomp_filter
+ 58.51% 57.81% bitcometd [kernel.kallsyms] [k] sk_run_filter
+ 8.17% 0.00% bitcometd [unknown] [.] 0000000000000000
+ 6.36% 6.36% bitcometd [kernel.kallsyms] [k] retint_userspace_restore_args
+ 5.27% 0.00% bitcometd [unknown] [.] 0x000001e805480789
+ 5.27% 0.00% bitcometd bitcometd [.] 0x00005600d3905240
+ 4.88% 4.88% bitcometd [kernel.kallsyms] [k] __x86_indirect_thunk_r8
+ 3.67% 3.67% bitcometd [kernel.kallsyms] [k] system_call_after_swapgs
+ 2.43% 0.40% bitcometd [kernel.kallsyms] [k] sys_epoll_wait
+ 2.29% 2.29% bitcometd libc-2.31.so [.] 0x000000000011f68e
+ 1.94% 0.02% bitcometd [kernel.kallsyms] [k] int_check_syscall_exit_work
+ 1.94% 0.22% bitcometd [kernel.kallsyms] [k] syscall_trace_leave
+ 1.71% 0.00% bitcometd [unknown] [.] 0xfbbdcf7705e15b00
+ 1.66% 1.64% bitcometd [vdso] [.] __vdso_gettimeofday
+ 1.36% 0.76% bitcometd [kernel.kallsyms] [k] __audit_syscall_exit
+ 1.31% 0.00% bitcometd [unknown] [.] 0x0000000000000001
+ 1.24% 0.21% bitcometd [kernel.kallsyms] [k] ep_poll
+ 1.21% 0.00% bitcometd [unknown] [.] 0xcde907894810c083
+ 1.21% 0.00% bitcometd bitcometd [.] 0x00005600d39e6280
+ 1.15% 0.00% bitcometd bitcometd [.] 0x00005600d39b597e
+ 1.12% 1.12% bitcometd [kernel.kallsyms] [k] seccomp_bpf_load
+ 1.08% 0.02% bitcometd [kernel.kallsyms] [k] apic_timer_interrupt
+ 1.04% 0.01% bitcometd [kernel.kallsyms] [k] smp_apic_timer_interrupt
+ 1.03% 0.94% bitcometd [kernel.kallsyms] [k] __audit_syscall_entry
+ 0.97% 0.01% bitcometd [kernel.kallsyms] [k] do_softirq
+ 0.96% 0.00% bitcometd [kernel.kallsyms] [k] call_softirq
+ 0.87% 0.02% bitcometd [kernel.kallsyms] [k] irq_exit
+ 0.86% 0.01% bitcometd [kernel.kallsyms] [k] __do_softirq
+ 0.76% 0.00% bitcometd bitcometd [.] 0x00005600d39e3019
+ 0.74% 0.74% bitcometd bitcometd [.] 0x0000000000989019
+ 0.69% 0.00% bitcometd [unknown] [.] 0x4800217f8010c083
+ 0.69% 0.00% bitcometd bitcometd [.] 0x00005600d39f0620
+ 0.69% 0.00% bitcometd [unknown] [.] 0x00005600d5ef78a0
+ 0.66% 0.02% bitcometd [kernel.kallsyms] [k] net_rx_action
+ 0.64% 0.00% bitcometd [unknown] [.] 0x0000004d0000002d
+ 0.57% 0.56% bitcometd [kernel.kallsyms] [k] _raw_spin_lock_irqsave
+ 0.54% 0.54% bitcometd [kernel.kallsyms] [k] fget_light
+ 0.54% 0.00% bitcometd bitcometd [.] 0x00005600d391349c
+ 0.52% 0.01% bitcometd [kernel.kallsyms] [k] virtnet_poll
0.49% 0.00% bitcometd [kernel.kallsyms] [k] __netif_receive_skb
0.48% 0.04% bitcometd [kernel.kallsyms] [k] __netif_receive_skb_core
0.47% 0.00% bitcometd [unknown] [.] 0x0000441f0f000000
0.47% 0.01% bitcometd [kernel.kallsyms] [k] local_apic_timer_interrupt
0.47% 0.00% bitcometd [kernel.kallsyms] [k] netif_receive_skb_internal
在 perf 分析结果中,sk_run_filter 占据了相当大的 CPU 使用量,这个函数通常用于网络数据包的过滤操作(如 BPF, Berkeley Packet Filter)。以下是几个可能的原因和建议:
可能的原因:
-
过滤规则复杂或数量多:
- 如果应用程序或系统在网络数据包过滤方面配置了大量或复杂的过滤规则,这可能导致高 CPU 使用。
-
高流量:
- 如果系统正在处理大量网络流量,特别是在高并发连接或数据包密集的情况下,会导致过滤器频繁调用。
-
次优的 BPF 程序:
- BPF 程序可能没有优化好,导致效率低下。
建议的措施:
-
优化过滤规则:
- 植入更加具体和简化的过滤规则,可能会减少
sk_run_filter的开销。
- 植入更加具体和简化的过滤规则,可能会减少
-
分析网络负载:
- 使用网络分析工具(如
iftop、nethogs)查看当前的网络流量,识别是否有异常流量导致高负载。
- 使用网络分析工具(如
-
BPF 程序优化:
- 查看和优化使用的 BPF 程序,通过减少复杂运算和指令可以提高性能。
-
更新内核/工具:
- 如果可能,检查内核更新和相关工具版本,以确保使用最新的优化和特性。
通过这些方法,你可以减少由 sk_run_filter 引起的 CPU 消耗。如果问题依然存在,可能需要更深入的分析,包括评估系统中运行的其他服务或应用程序的网络行为。









