在 Linux (Ubuntu 18) 中设置function_graph
跟踪器时,存储在 /sys/kernel/debug/tracing/trace 中的跟踪在覆盖自身之前仅存储几秒钟。
由于周期可能会变化,我无法将其保存为例如
cat /sys/kernel/debug/tracing/trace >> total_trace
因为它可能会产生在后处理过程中不可接受的重复项。最糟糕的是,它可能会丢失一些信息。
有没有一种方法可以打开文件并将所有新传入的信息通过管道传输到另一个文件?
谢谢
答案1
trace_pipe
:
输出与“trace”文件相同,但该文件旨在通过实时跟踪进行流式传输。从此文件中读取数据将被阻塞,直到检索到新数据为止。与“trace”文件不同,该文件是一个消费者。这意味着从此文件读取会导致顺序读取以显示更多当前数据。一旦从此文件中读取数据,数据就会被消耗,并且不会通过顺序读取再次读取。 “跟踪”文件是静态的,如果跟踪器没有添加更多数据,则每次读取时都会显示相同的信息。该文件在读取时不会禁用跟踪。
或者使用trace-cmd(1)
,特别是trace-cmd-show
。从其手册页:
-p
(小写“P”)使用“trace_pipe”文件,而不是显示“trace”文件的内容。两者之间的区别在于“trace”文件是静态的。也就是说,如果跟踪停止,“trace”文件每次都会显示相同的内容。
“trace_pipe”文件是消耗性读取,文件的读取将消耗所读取内容的输出,并且即使停止跟踪也不会再次读取相同的内容。该文件也会被阻止。如果没有可用数据,
trace-cmd show
将停止并等待数据出现。
另请参阅克尼奥的回答到如何设置ftrace中trace_pipe的缓冲区大小?(在 Stack Overflow 上)了解如何更改 trace
文件的大小和行为。
答案2
使用
cat trace_pipe
cat trace_pipe | grep nfs
cat trace_pipe > kernel_trace.txt