这是命令 trace-cmd-record 可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
trace-cmd-record - 记录来自 Ftrace Linux 内部跟踪器的跟踪
概要
跟踪命令 记录 [配置[命令]
商品描述
这个 跟踪命令(1) record命令会设置Ftrace Linux kernel tracer来记录
指定的插件或事件发生时 命令 执行。 如果没有命令
给定,然后它会一直记录,直到用户按下 Ctrl-C。
trace-cmd 的记录命令将设置 Ftrace 跟踪器开始跟踪各种
在命令行上给出的事件或插件。 然后它会创建一些
跟踪将从内核环形缓冲区开始记录的进程(每个 CPU 一个)
直接进入临时文件。 当命令完成(或按 Ctrl-C)时,所有的
文件将组合成一个 trace.dat 文件,以后可以读取(请参阅
跟踪命令报告(1))。
配置
-p 插入
指定跟踪插件。 插件是特殊的 Ftrace 跟踪器,通常比
只需跟踪一个事件。 常见的插件有 function, 函数图, 抢占式中断,
中断, 抢占和 醒来. 正在运行的内核必须支持插件。 到
查看可用插件列表,请参见 跟踪命令列表(1)。
-e 活动
指定要跟踪的事件。 各种静态跟踪点已添加到 Linux
核心。 它们按子系统分组,您可以在其中启用给定的所有事件
子系统或指定要启用的特定事件。 这 活动 是格式
“子系统:事件名称”。 您也可以只指定子系统而不指定
:事件名称 或没有“子系统:”的事件名称。 使用“-e sched_switch”将
启用“sched_switch”事件,因为“-e sched”将启用下的所有事件
“调度”子系统。
“事件”还可以包含全局表达式。 也就是说,“*stat*”将
选择所有包含字符“stat”的事件(或子系统)
名称。
关键字“all”可用于启用所有事件。
-a
正在记录的每个事件都有其输出格式文件保存在输出文件中
以便以后显示。 但是如果在跟踪中启用了其他事件而没有
trace-cmd 的知识,这些事件的格式将不会被记录和 trace-cmd
报告将无法显示它们。 如果是这种情况,则指定 -a
选项,系统中所有事件的格式将被保存。
-T
在每个事件上启用堆栈跟踪。 例如:
-0 [003] 58549.289091: sched_switch: kworker/0:1:0 [120] R ==> trace-cmd:2603 [120]
-0 [003] 58549.289092: kernel_stack:
=> 时间表(ffffffff814b260e)
=> cpu_idle (ffffffff8100a38c)
=> start_secondary (ffffffff814ab828)
--函数堆栈
在所有函数上启用堆栈跟踪。 请注意,这仅适用于“功能”
插件跟踪器,只有在使用 -l 选项并成功时才会生效
限制功能。 如果没有过滤函数跟踪器,并且堆栈跟踪是
启用后,您可以实时锁定机器。
-f 过滤
为上一个事件指定过滤器。 这必须在一个 -e. 这将过滤
根据事件的内容记录哪些事件。 过滤传递给
内核直接所以允许什么过滤可能取决于内核的版本
你有。 基本上,它会让你使用 C 符号来检查一个事件是否应该
处理与否。
==、>=、<=、>、<、&、|、&&和||
以上通常可以安全地用于比较字段。
-R 触发
指定前一个事件的触发器。 这必须在一个 -e. 这将添加一个
给定事件的给定触发器。 只启用触发器而不启用事件本身,
然后将事件放在 -v 选项。
有关更多信息,请参阅 Linux 内核源代码中的 Documentation/trace/events.txt
有关触发器的信息。
-v
这将导致无法跟踪在命令行上指定的所有事件。
这对于选择要跟踪的子系统但忽略各种事件很有用。
例如:"-e sched -v -e "*stat\*"" 将启用 sched 子系统中的所有事件
除了那些名字中有“stat”的人。
注意: *-v* 选项取自方式 grep的(1) 反转以下内容
匹配。
-F
这将仅过滤命令行上给出的可执行文件。 如果没有命令
给出,然后它会过滤自己(非常没有意义)。 使用 -F 会让你追踪
仅由给定命令引起的事件。
-P PID
像 -F 但允许您指定要跟踪的进程 ID。
-c
与任何一个一起使用 -F 也可以追踪这个过程的孩子。
-C 时钟
将跟踪时钟设置为“时钟”。
使用 VHDL 语言编写 跟踪命令(1) list -C 查看可用的时钟。
-o 输出文件
默认情况下,trace-cmd 报告将创建一个 跟踪文件 文件。 您可以指定不同的
要写入的文件 -o 选项。
-l 函数名
这将限制 function 和 函数图 追踪器只追踪给定的
函数名。 超过一个 -l 可以在命令行指定跟踪更多
不止一个功能。 也允许限制使用 glob 表达式。 这些是
比赛* 仅过滤以开头的函数 匹配. *比赛 只过滤
结尾的函数 匹配. *比赛\* 只过滤包含的函数
匹配.
-g 函数名
此选项用于 function_graph 插件。 它将绘制给定的函数。 那
也就是说,它只会跟踪函数和它调用的所有函数。 你可以有更多
比一个 -g 在命令行上。
-n 函数名
这具有相反的效果 -l. 给出的函数 -n 选项不会是
追踪。 这优先,也就是说,如果您为两者都包含相同的功能 -n
和 -l,它不会被追踪。
-d
一些跟踪器插件默认启用功能跟踪器。 就像延迟跟踪器一样。
此选项可防止在启动时启用功能跟踪器。
-D
选项 -d 将尝试使用 function-trace 选项禁用功能跟踪器
(如果可用),否则默认为 proc 文件:
/proc/sys/kernel/ftrace_enabled, 但如果函数跟踪选项是
可用。 的 -D 选项将禁用 ftrace_enabled proc 文件以及
函数跟踪选项(如果存在)。
注意,这对所有用户禁用功能跟踪,包括用户
在 ftrace 跟踪器(stack_tracer、perf 等)之外。
-O 选项
Ftrace 有各种可以启用或禁用的选项。 这允许您设置
他们。 附加文本 没有 到一个选项禁用它。 例如:“-O nograph-time”
将禁用“图形时间”Ftrace 选项。
-s 间隔
trace-cmd 创建的从环形缓冲区记录的进程需要唤醒
做录音。 设置 间隔 为零将导致进程唤醒
每次将新数据写入缓冲区时。 但是由于 Ftrace 正在记录内核
活动,该进程重新进入睡眠状态的行为可能会导致新事件进入
将唤醒进程备份的环形缓冲区。 这将不必要地添加额外的数据
进入环形缓冲区。
“间隔”指标是微秒。 默认设置为 1000(1 毫秒)。
这是每个记录进程在醒来之前会休眠的时间
记录写入环形缓冲区的任何新数据。
-r 优先
运行捕获线程的优先级。 在繁忙的系统中,跟踪捕获
线程可能会被搁置,事件可能会丢失。 这增加了那些的优先级
线程的实时 (FIFO) 优先级。 但是要小心使用这个选项,它也可以
改变被跟踪系统的行为。
-b 尺寸
这将环形缓冲区大小设置为 尺寸 千字节。 因为 Ftrace 环形缓冲区是
每个 CPU,这个大小是内核中每个 CPU 环形缓冲区的大小。 使用
在有 10000 个 CPU 的机器上使用“-b 4”将使 Ftrace 的总缓冲区大小为 40
梅格斯。
-B 缓冲区名称
如果内核支持多个缓冲区,这将添加一个具有给定名称的缓冲区。
如果缓冲区名称已经存在,则该缓冲区只是重置,不会被删除
在记录执行结束时。 如果缓冲区被创建,它将在
执行结束(除非 -k 已设置,或 开始 命令被使用)。
声明缓冲区名称后,在此之后添加的所有事件都将是
与该缓冲区相关联。 如果未指定缓冲区或事件
在缓冲区名称之前指定,它将与
主(顶层)缓冲区。
trace-cmd 记录 -e sched -B 块 -e 块 -B 时间 -e 定时器睡眠 1
以上是将启用主缓冲区中的所有 sched 事件。 它会
然后创建一个“块”缓冲区实例并启用其中的所有块事件
那个缓冲区。 一个“时间”缓冲区实例被创建,所有的计时器事件
将为该事件启用。
-m 尺寸
每个 cpu 缓冲区应该是的最大大小(以千字节为单位)。 注意,由于四舍五入
页面大小,数字可能不完全正确。 此外,这是通过切换来执行的
在给定大小一半的两个缓冲区之间,因此输出可能不是
给定的大小,即使写了更多。
使用它可以防止长时间运行时磁盘空间不足。
-M 处理器掩码
设置 cpumask 以进行跟踪。 它只影响给定的最后一个缓冲区实例。 如果
在任何缓冲区实例之前提供,然后它会影响主缓冲区。 价值
提供的必须是十六进制数。
trace-cmd 记录 -p 函数 -M c -B events13 -e all -M 5
如果省略 -M,则掩码保持不变。 启用所有
CPU,传入“-1”值。
-k
默认情况下,当 trace-cmd 完成跟踪时,它将重置缓冲区并禁用
它启用的所有跟踪。 此选项可防止 trace-cmd 禁用跟踪器
并重置缓冲区。 此选项对于调试 trace-cmd 很有用。
注意:通常 trace-cmd 会将“tracing_on”文件设置回它的内容
是在它被调用之前。 此选项将使该文件设置为零。
-i
默认情况下,如果列出了 trace-cmd 未找到的事件,它将退出并显示
错误。 此选项将忽略在命令行上列出但在
在系统上找不到。
-N 主机:端口
如果另一台机器正在运行“trace-cmd listen”,则此选项用于将数据
使用 UDP 数据包发送到该机器。 而不是写入输出文件,数据
被发送到远程信箱。 这非常适合存储空间小的嵌入式机器,
或者拥有一台将所有数据保存在一个存储库中的机器。
注意:延迟跟踪器插件不支持此选项:
唤醒、wakeup_rt、irqsoff、preemptoff 和 preemptirqsoff
-t
此选项用于 -N, 当需要用 TCP 发送实时数据时
数据包而不是 UDP。 尽管 TCP 没有发送 UDP 数据包快,
但如果网络不是那么可靠,数据量不高,则可能需要
如此密集,并且需要保证所有跟踪的信息都被传输
成功。
- 日期
随着 - 日期 选项,“trace-cmd”将在之后将时间戳写入跟踪缓冲区
它已经完成录制。 然后它将时间戳映射到 gettimeofday 这将
允许从读取创建的时间戳的墙上时间输出 跟踪文件 文件中。
- 轮廓
随着 - 轮廓 选项,“trace-cmd”将启用可用于的跟踪
跟踪命令报告(1) --profile 选项。 如果一个示踪剂 -p 未设置,功能图
内核支持深度,然后将启用 function_graph 跟踪器
深度为 XNUMX(仅显示用户空间进入内核的位置)。 它还将启用
具有堆栈跟踪的各种跟踪点,以便报告可以显示任务的位置
被屏蔽最久。
参见 跟踪命令配置文件(1) 有关更多详细信息和示例。
-H 事件挂钩
添加自定义事件匹配以将任意两个事件连接在一起。 不使用时
- 轮廓, 它将保存参数,这将被 trace-cmd 报告使用
--个人资料也是。 那是:
trace-cmd 记录 -H hrtimer_expire_entry,hrtimer/hrtimer_expire_exit,hrtimer,sp
trace-cmd 报告 --profile
将分析 hrtimer_expire_entry 和 hrtimer_expire_ext 时间。
参见 跟踪命令配置文件(1) 格式。
--标准错误
有输出到 stderr 而不是 stdout,但执行的命令的输出
不会改变。 如果您想监视命令的输出,这很有用
正在执行,但看不到 trace-cmd 的输出。
示例
跟踪所有事件的基本方法:
# trace-cmd record -e all ls > /dev/null
# trace-cmd 报告
trace-cmd-13541 [003] 106260.693809:filemap_fault:地址=0x128122 偏移=0xce
trace-cmd-13543 [001] 106260.693809:kmalloc:call_site=81128dd4 ptr=0xffff88003dd83800 bytes_req=768 bytes_alloc=1024 gfp_flags=GFP_KERNEL|GFP_ZERO
ls-13545 [002] 106260.693809: kfree: call_site=810a7abb ptr=0x0
ls-13545 [002] 106260.693818: sys_exit_write: 0x1
将函数跟踪器与 sched 开关跟踪一起使用:
# trace-cmd record -p function -e sched_switch ls > /dev/null
# trace-cmd 报告
ls-13587 [002] 106467.860310:功能:hrtick_start_fair <--pick_next_task_fair
ls-13587 [002] 106467.860313:sched_switch:prev_comm=trace-cmd prev_pid=13587 prev_prio=120 prev_state=R ==> next_comm=trace-cmd next_pid=13583 next_prio=120
trace-cmd-13585 [001] 106467.860314:函数:native_set_pte_at <-- __do_fault
trace-cmd-13586 [003] 106467.860314:功能:up_read <-- do_page_fault
ls-13587 [002] 106467.860317:函数:__phys_addr <-- schedule
trace-cmd-13585 [001] 106467.860318:功能:_raw_spin_unlock <-- __do_fault
ls-13587 [002] 106467.860320:函数:native_load_sp0 <-- __switch_to
trace-cmd-13586 [003] 106467.860322:功能:down_read_trylock <-- do_page_fault
这里有一个很好的方法来找出哪些中断具有最高的延迟:
# trace-cmd 记录 -p function_graph -e irq_handler_entry -l do_IRQ sleep 10
# trace-cmd 报告
-0 [000] 157412.933969:funcgraph_entry:| do_IRQ() {
-0 [000] 157412.933974:irq_handler_entry:irq=48 name=eth0
-0 [000] 157412.934004: funcgraph_exit: + 36.358 us | }
-0 [000] 157413.895004:funcgraph_entry:| do_IRQ() {
-0 [000] 157413.895011:irq_handler_entry:irq=48 name=eth0
-0 [000] 157413.895026: funcgraph_exit: + 24.014 us | }
-0 [000] 157415.891762:funcgraph_entry:| do_IRQ() {
-0 [000] 157415.891769:irq_handler_entry:irq=48 name=eth0
-0 [000] 157415.891784: funcgraph_exit: + 22.928 us | }
-0 [000] 157415.934869:funcgraph_entry:| do_IRQ() {
-0 [000] 157415.934874:irq_handler_entry:irq=48 name=eth0
-0 [000] 157415.934906: funcgraph_exit: + 37.512 us | }
-0 [000] 157417.888373:funcgraph_entry:| do_IRQ() {
-0 [000] 157417.888381:irq_handler_entry:irq=48 name=eth0
-0 [000] 157417.888398: funcgraph_exit: + 25.943 us | }
配置文件示例:
# trace-cmd 记录 --profile sleep 1
# trace-cmd 报告 --profile --comm 睡眠
任务:sleep-21611
事件:sched_switch:R (1) 总数:99442 平均值:99442 最大值:99442 最小值:99442
1 总数:99442 最小值:99442 最大值:99442 平均值=99442
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> preempt_schedule (0xffffffff8150842e)
=> ___preempt_schedule (0xffffffff81273354)
=> cpu_stop_queue_work (0xffffffff810b03c5)
=> stop_one_cpu (0xffffffff810b063b)
=> sched_exec (0xffffffff8106136d)
=> do_execve_common.isra.27 (0xffffffff81148c89)
=> do_execve (0xffffffff811490b0)
=> SyS_execve (0xffffffff811492c4)
=> return_to_handler (0xffffffff8150e3c8)
=> stub_execve (0xffffffff8150c699)
事件:sched_switch:S (1) 总数:1000506680 平均值:1000506680 最大值:1000506680 最小值:1000506680
1 总数:1000506680 最小值:1000506680 最大值:1000506680 平均值=1000506680
=> ftrace_raw_event_sched_switch (0xffffffff8105f812)
=> __schedule (0xffffffff8150810a)
=> 时间表(0xffffffff815084b8)
=> do_nanosleep (0xffffffff8150b22c)
=> hrtimer_nanosleep (0xffffffff8108d647)
=> SyS_nanosleep (0xffffffff8108d72c)
=> return_to_handler (0xffffffff8150e3c8)
=> tracesys_phase2 (0xffffffff8150c304)
事件:sched_wakeup:21611 (1) 总数:30326 平均值:30326 最大值:30326 最小值:30326
1 总数:30326 最小值:30326 最大值:30326 平均值=30326
=> ftrace_raw_event_sched_wakeup_template (0xffffffff8105f653)
=> ttwu_do_wakeup (0xffffffff810606eb)
=> ttwu_do_activate.constprop.124 (0xffffffff810607c8)
=> try_to_wake_up (0xffffffff8106340a)
使用 onworks.net 服务在线使用 trace-cmd-record