性能数据(perf.data)过大,但事件数量太少。

3

使用以下命令记录了一些统计数据:

perf record -a -F 20 -o perf.data -e major-faults sleep 1800

得到了 perf.data 文件,大小约为1GB,其中包含355个样本和7592个事件计数:

# Total Lost Samples: 0
#
# Samples: 355  of event 'major-faults'
# Event count (approx.): 7592

为什么有些样本占用了很多空间?是否有工具可以查看perf.data文件中包含的内容?使用以下命令:perf report -i perf.data -D,我在perf.data文件中找到了这些事件:(截取了每个事件的十六进制转储)
0 0 0x63a0 [0x30]: PERF_RECORD_COMM: gmain:1000/1010
0x63d0 [0x38]: event: 7
0 0 0x63d0 [0x38]: PERF_RECORD_FORK(1004:1004):(1:1)
0x6408 [0x30]: event: 3
0 0 0x6408 [0x30]: PERF_RECORD_COMM: cron:1004/1004
0x6438 [0x70]: event: 10
0 0 0x6438 [0x70]: PERF_RECORD_MMAP2 1004/1004: [0x5586d93d0000(0xb000) @ 0 fd:01 3285696 93896821003936]: r-xp /usr/sbin/cron

但我没有要求perf使用-e选项记录这些事件。如何避免记录这些事件?


查看perf.data的工具是perf script。它会转储文件中记录的每个事件。还支持-D选项以添加十六进制转储:perf script -D。您使用-a选项要求perf进行系统范围的记录,并且为了能够解码任何程序中的事件,它必须在每个CPU上记录每个程序启动和执行段mmaping的所有1800秒。不知道如何避免使用选项在perf中记录这些事件(perf默认使用perf_event_open系统调用参数请求操作系统进行记录)。您应该检查像bpf(http://www.brendangregg.com/ebpf.html)或lttng这样的跟踪工具。 - osgx
1个回答

2
如@osgx已经提到的,查看perf.data文件内部的工具是perf script。perf script -D在十六进制格式中转储perf.data文件中的原始事件。 perf.data文件包含由性能监控单元生成的所有事件以及一些元数据。磁盘上的perf.data文件通常以以下格式的perf_header结构开始:
struct perf_header {
    char magic[8];      /* PERFILE2 */
    uint64_t size;      /* size of the header */
    uint64_t attr_size; /* size of an attribute in attrs */
    struct perf_file_section attrs;
    struct perf_file_section data;
    struct perf_file_section event_types;
    uint64_t flags;
    uint64_t flags1[3];
};

大部分的perf.data文件包含了性能事件,这些事件可以包括在此处提到的任何事件类型,其中包含每个事件的元数据,如32位进程ID和线程ID、指令指针、正在使用的CPU等信息。存储这些元数据取决于传递的各种标志,如PERF_SAMPLE_PIDPERF_SAMPLE_TID等。请查看perf_event_open手册页。您可以禁用记录某些元数据,并减少写入文件的每个事件数据的大小。
PERF_RECORD_COMM”,“PERF_RECORD_FORK”和“PERF_RECORD_MMAP”等是由内核记录的旁路事件,以帮助进一步的后处理和详细分析。它们在内核源代码中默认启用,可以在这里看到。”
struct perf_event_attr {

                ........
                mmap           :  1, /* include mmap data     */
                comm           :  1, /* include comm data     */
                freq           :  1, /* use freq, not period  */
                inherit_stat   :  1, /* per task counts       */
                enable_on_exec :  1, /* next exec enables     */
                task           :  1, /* trace fork/exit       */

这段文字的意思是:在这些领域中,1 表示它们默认启用,如果要禁用记录这些事件,您需要在源代码中将它们设置为 0 ,并且只重新编译内核的用户空间 perf 模块。如果设置为 0,则不会记录这些事件,可以在此处here查看。没有任何命令行开关或选项可以启用禁用这些事件。

重新编译perf工具需要在https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/网站上重新打包一些源代码。 (perf是庞大的Linux内核源代码的一部分,需要一些内核文件夹;这些tar文件只是重新编译perf工具的更方便的方式,而无需下载完整的Linux内核源代码)。 - osgx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接