---
title: I/O分析任务执行失败
description: "I/O分析任务执行失败，失败原因是：任务采集失败，系统暂不支持。请检查系统是否支持或是否已开启ftrace。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevkithistory/devkit_24/usermanual/kunpengfaq_06_0012.html
sourcePath: /source/zh/kunpengdevkithistory/devkit_24/usermanual/kunpengfaq_06_0012.html
indexId: b858a9ef858796a813b78fe4a75ea847c7fff2860f32b1592789ffa3e0a5392276
---
# I/O分析任务执行失败

#### 现象描述

I/O分析任务执行失败，失败原因是：任务采集失败，系统暂不支持。请检查系统是否支持或是否已开启ftrace。


#### 可能原因

系统内核版本不支持ftrace的采集。


#### 处理步骤

ftrace是内建于Linux内核的跟踪工具，从2.6.27开始加入主流内核。使用ftrace可以调试或者分析内核中发生的事情。ftrace提供了不同的跟踪器，以用于不同的场合，例如跟踪内核函数调用、对上下文切换进行跟踪、查看中断被关闭的时长、跟踪内核态中的延迟以及性能问题等。系统开发人员可以使用ftrace对内核进行跟踪调试，以找到内核中出现的问题的根源，方便对其进行修复。另外，对内核感兴趣的用户还可以通过ftrace来观察内核中发生的活动，了解内核的工作机制。


重新编译内核，详细操作如下：

1. 让内核支持ftrace。

  a. 使用ftrace，首先要将其编译进内核。内核源码目录下的“kernel/trace/Makefile”文件给出了ftrace相关的编译选项，如    表1
所示。
**表1 ftrace相关的配置选项列表**

| 序号 | 配置选项 |
| --- | --- |
| 1 | CONFIG\_FUNCTION\_TRACER |
| 2 | CONFIG\_FUNCTION\_GRAPH\_TRACER |
| 3 | CONFIG\_CONTEXT\_SWITCH\_TRACER |
| 4 | CONFIG\_NOP\_TRACER |
| 5 | CONFIG\_SCHED\_TRACER |
| 6 | ... |


    ftrace相关的配置选项比较多，针对不同的跟踪器有各自对应的配置选项。不同的选项有不同的依赖关系，内核源码目录下的“kernel/trace/Kconfig”文件描述了这些依赖关系。用户可以参见Makefile文件和Kconfig文件，然后选中自己所需要的跟踪器。

  b. 通常在配置内核时，使用make menuconfig会更直观一些。以2.6.33.1版本的内核为例，要将ftrace编译进内核，可以按照    图1
选择Kernel hacking，按照    图2
选择Tracers菜单项。
    图1 Linux内核配置-Kernel hacking

    图2 Linux内核配置-Tracers

  c. 进入Tracers菜单下，可以看到内核支持的跟踪器列表。如    图3
所示，这里选中了所有的跟踪器，用户可以根据自己的需要选中特定的跟踪器。
    图3 内核支持的跟踪器列表

    如果是在32位x86机器上，编译时不要选中图4General setup菜单项下的Optimize for size选项，如图5所示，否则就无法看到图3中的Kernel Function Graph Tracer选项。这是因为在Kconfig文件中，针对32 位x86机器，表项FUNCTION_GRAPH_TRACER有一个特殊的依赖条件“depends on !X86_32 || !CC_OPTIMIZE_FOR_SIZE”。

    图4 General setup

    图5 Optimize for size

  d. ftrace通过debugfs向用户态提供了访问接口，所以还需要将debugfs编译进内核。激活对debugfs的支持，可以直接编辑内核配置文件.config，设置CONFIG_DEBUG_FS=y；或者在make menuconfig时到Kernel hacking菜单下选中对debugfs文件系统的支持，如    图6
所示。
    图6 debugfs编译选项

  e. 配置完成后，编译安装新内核，然后启动到新内核。
    激活ftrace支持后，编译内核时会使用编译器的-pg选项，这是在“kernel/trace/Makefile”文件中定义的，如下所示。

```
ifdef CONFIG_FUNCTION_TRACER
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg,,$(ORIG_CFLAGS))
endif
```


    使用-pg选项会在编译得到的内核映像中加入大量的调试信息。一般情况下，只是在开发测试阶段激活ftrace支持，以调试内核，修复bug 。最终用于发行版的内核则会关闭-pg选项，也就无法使用ftrace。

2. 通过debugfs访问ftrace。

  a. ftrace通过debugfs向用户态提供访问接口。配置内核时激活debugfs后会创建目录“/sys/kernel/debug”，debugfs文件系统就是挂载到该目录。
    要挂载该目录，需要将如下内容添加到“/etc/fstab”
    文件：

```
debugfs  /sys/kernel/debug  debugfs  defaults  0  0
```


    或者可以在运行时挂载：

```
mount  -t  debugfs  nodev  /sys/kernel/debug
```


  b. 激活内核对ftrace的支持后会在debugfs下创建一个tracing目录“/sys/kernel/debug/tracing”。该目录下包含了ftrace的控制和输出文件，如    图7
所示。根据编译内核时针对ftrace的设定不同，该目录下实际显示的文件和目录与这里也会不同。
    图7 tracing目录下的文件


#### ftrace的数据文件

“/sys/kernel/debug/trace”目录下文件和目录比较多，有些是各种跟踪器共享使用的，有些是特定于某个跟踪器使用的。在操作这些数据文件时，通常使用echo命令来修改其值，也可以在程序中通过文件读写相关的函数来操作这些文件的值。表2只对部分文件进行描述，用户可以参见内核源码包中“Documentation/trace”目录下的文档以及“kernel/trace”下的源文件以了解其余文件的用途。


**表2 ftrace的数据文件**

| 文件 | 用途 |
| --- | --- |
| README | README文件提供了一个简短的使用说明，展示了ftrace的操作命令序列。可以通过cat命令查看该文件以了解概要的操作流程。 |
| current\_tracer | current\_tracer用于设置或显示当前使用的跟踪器；使用echo将跟踪器名字写入该文件可以切换到不同的跟踪器。系统启动后，其缺省值为nop，即不做任何跟踪操作。在执行完一段跟踪任务后，可以通过向该文件写入nop来重置跟踪器。 |
| available\_tracers | available\_tracers记录了当前编译进内核的跟踪器的列表，可以通过cat查看其内容；其包含的跟踪器与图3中所激活的选项是对应的。写current\_tracer文件时用到的跟踪器名字必须在该文件列出的跟踪器名字列表中。 |
| trace | trace文件提供了查看获取到的跟踪信息的接口。可以通过cat等命令查看该文件以查看跟踪到的内核活动记录，也可以将其内容保存为记录文件以备后续查看。 |
| tracing\_enabled | tracing\_enabled用于控制current\_tracer中的跟踪器是否可以跟踪内核函数的调用情况。 写入0会关闭跟踪活动。 写入1则激活跟踪功能，其缺省值为 1 。 |
| set\_graph\_function | set\_graph\_function设置要清晰显示调用关系的函数，显示的信息结构类似于C语言代码，这样在分析内核运作流程时会更加直观一些。在使用function\_graph跟踪器时使用；缺省为对所有函数都生成调用关系序列，可以通过写该文件来指定需要特别关注的函数。 |
| buffer\_size\_kb | buffer\_size\_kb用于设置单个CPU所使用的跟踪缓存的大小。跟踪器会将跟踪到的信息写入缓存，每个CPU的跟踪缓存是一样大的。跟踪缓存实现为环形缓冲区的形式，如果跟踪到的信息太多，则旧的信息会被新的跟踪信息覆盖掉。 说明： 要更改该文件的值需要先将“current\_tracer”设置为“nop”才可以。 |
| tracing\_on | tracing\_on用于控制跟踪的暂停。有时候在观察到某些事件时想暂时关闭跟踪，可以将0写入该文件以停止跟踪，这样跟踪缓冲区中比较新的部分是与所关注的事件相关的；写入1可以继续跟踪。 |
| available\_filter\_functions | available\_filter\_functions记录了当前可以跟踪的内核函数。对于不在该文件中列出的函数，无法跟踪其活动。 |
| set\_ftrace\_filter和set\_ftrace\_notrace | set\_ftrace\_filter和set\_ftrace\_notrace在编译内核时配置了动态ftrace（选中CONFIG\_DYNAMIC\_FTRACE选项）后使用。前者用于显示指定要跟踪的函数，后者则作用相反，用于指定不跟踪的函数。如果一个函数名同时出现在这两个文件中，则这个函数的执行状况不会被跟踪。这些文件还支持简单形式的含有通配符的表达式，这样可以用一个表达式一次指定多个目标函数。缺省为可以跟踪所有内核函数，文件set\_ftrace\_notrace的值则为空。 说明： 要写入这两个文件的函数名必须可以在文件available\_filter\_functions中看到。 |


#### ftrace跟踪器

ftrace当前包含多个跟踪器，用于跟踪不同类型的信息，例如进程调度、中断关闭等。可以查看文件available_tracers获取内核当前支持的跟踪器列表。在编译内核时，也可以看到内核支持的跟踪器对应的选项，如图3所示。


**表3 ftrace跟踪器**

| 跟踪器 | 说明 |
| --- | --- |
| nop | nop跟踪器不会跟踪任何内核活动，将nop写入current\_tracer文件可以删除之前所使用的跟踪器，并清空之前收集到的跟踪信息，即刷新trace文件。 |
| function | function跟踪器可以跟踪内核函数的执行情况，可以通过文件set\_ftrace\_filter显示指定要跟踪的函数。 |
| function\_graph | function\_graph跟踪器可以显示类似C源码的函数调用关系图，这样查看起来比较直观一些，可以通过文件set\_graph\_function显示指定要生成调用流程图的函数。 |
| sched\_switch | sched\_switch跟踪器可以对内核中的进程调度活动进行跟踪。 |
| irqsoff和preemptoff | irqsoff跟踪器和preemptoff跟踪器分别跟踪关闭中断的代码和禁止进程抢占的代码，并记录关闭的最大时长，preemptirqsoff跟踪器则可以看作它们的组合。 |


ftrace还支持其他一些跟踪器，例如initcall、ksym_tracer、mmiotrace、sysprof等。ftrace框架支持扩展添加新的跟踪器。用户可以参见内核源码包中“Documentation/trace”目录下的文档以及“kernel/trace”下的源文件，以了解其他跟踪器的用途和如何添加新的跟踪器。
