在管道中使用时如何防止 perf 写入标准输出?

问题描述 投票:0回答:1

我正在运行两个程序,其中一个程序的标准输出通过管道传输到另一个程序的标准输入。我通过以下方式使用命名管道执行此操作(为了演示而简化):

$ mkfifo feedback
$ ./program1 < feedback | ./program2 > feedback

我注意到程序 1 中存在一些性能问题,因此我尝试在

perf-record
下运行它,如下所示:

$ perf record -g ./program1 < feedback | ./program2 > feedback

但是 2 号程序因输入无效而失败。这是一个十六进制转储:

$ perf record -g ./program1 < feedback | tee p1_to_p2 | ./program2 > feedback
$ hexdump -C p1_to_p2
00000000  50 45 52 46 49 4c 45 32  10 00 00 00 00 00 00 00  |PERFILE2........|
00000010

通过谷歌快速搜索,我发现

PERFILE2
是perf数据文件的神奇数字,所以看起来当在管道中使用时perf通过
stdout
发送其数据。

我想避免这种行为,只是让 perf 像平常一样输出一个文件,但在 perf 手册中没有找到任何相关内容。

如何强制 perf 输出到文件?

linux shell named-pipes perf
1个回答
0
投票

使用

perf-record
-o
--output
标志。来自
man perf-record

   -o, --output=
       Output file name.

然后我们就可以写了

$ perf record -o perf.data -g ./program1 < feedback | ./program2 > feedback

并且

perf
会将其输出数据写入指定的文件,即使它正在管道中使用。

© www.soinside.com 2019 - 2024. All rights reserved.