You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perfetto捕获sched_blocked_reason无阻塞函数问题求助

关于sched_blocked_reason事件的疑问解答

1. sched_blocked_reason事件的含义

sched_blocked_reason是Linux内核ftrace提供的调度类事件,用来记录进程被从CPU调度出去时的阻塞原因。你给出的示例字段含义如下:

  • pid=4821:被阻塞的目标进程ID
  • io_wait=0:标记阻塞是否由IO等待触发(0表示非IO等待,1表示IO等待)
  • caller=2:理论上这里应该是触发阻塞的内核函数地址,但值为2说明内核未正确填充该字段,或符号解析失败

2. 对系统性能的影响

如果系统中出现大量这类事件,通常意味着:

  • 进程频繁被阻塞,会导致上下文切换次数激增,CPU资源浪费在进程切换开销上,整体吞吐量下降
  • 若io_wait=1占比高:说明系统存在IO瓶颈,比如磁盘读写慢、外设响应延迟,进程卡在等待IO完成的状态
  • 若io_wait=0占比高:大概率是内核同步机制阻塞,比如锁竞争(互斥锁、自旋锁)、信号量等待、或等待其他内核事件,这类情况会导致进程无法高效利用CPU资源

3. Perfetto无法获取阻塞函数信息的原因

和atrace相比,Perfetto默认对ftrace事件的符号解析配置更保守,主要原因包括:

  • 符号解析未开启:Perfetto默认不会自动对sched_blocked_reason的caller字段做符号解析,而atrace默认可能开启了该功能。你需要在Perfetto的ftrace配置中显式开启相关选项,示例配置如下:
    data_sources: 
    {
         config {
             name: "linux.ftrace"
             ftrace_config {
                 ftrace_events: "sched/sched_blocked_reason"
                 enable_symbols: true
                 enable_callstack: true
             }
         }
    }
    
  • 内核符号访问权限:Perfetto进程需要读取/proc/kallsyms的权限(通常需要root),如果没有权限,无法将内核地址解析为函数名
  • 内核配置限制:你的内核可能未开启CONFIG_SCHED_DEBUG或CONFIG_KALLSYMS_ALL,这两个配置是正确生成sched_blocked_reason事件中caller字段和符号解析的前提
  • 内核版本差异:部分旧内核版本中sched_blocked_reason事件的caller字段填充逻辑存在bug,导致无法正确记录阻塞函数地址,这种情况下需要升级内核

内容的提问来源于stack exchange,提问作者heyan zhuo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:12:36