Perf 缓冲区的确切大小是多少?

What is the exactly Perf buffer size?

在阅读了perf_event_open()manual之后,我对捕获采样事件中缓冲区的大小有一些疑问。

在描述部分,它说

A sampling event periodically writes measurements to a buffer that can then be accessed via mmap(2).

而当buffer溢出时,PMU会触发PMI,我们可以通过mmap()系统调用来访问buffer的内容。 (我的理解对吗?)

但问题是,Perf缓冲区有多大?我可以设置一个新值(缓冲区长度)来覆盖它吗?

struct perf_event_mmap_page中的变量__u64 data_size只表示本次记录的大小

你的理解是正确的,当你说你可以使用mmap定期收集性能数据时。

在我开始之前,perf 使用两个缓冲区来记录不同类型的事件。 在主环形缓冲区下使用辅助缓冲区(环形缓冲区包含此辅助缓冲区),用于存储各种事件信息。既然你问我关于主要性能缓冲区的问题,我会尝试回答这个问题。

您可以修改perf 缓冲区大小。根据文档,perf 缓冲区大小是根据 页数 定义的。它被定义为 1 + 2^n 页,其中一页需要存储有关 perf 使用的环形缓冲区的元数据。

当您尝试使用 perf record 记录事件时(阅读 perf record 的联机帮助页),您将有一个开关 -m,它允许您指定 increase/decrease perf 环形缓冲区。你指定的(mmap)页数必须是2的幂。(不过你也可以直接指定大小)页数增加1,会增加环缓冲区大小 4kB(这是页面大小,在代码中由 1 << 12 指定)。

不过,据我所知,这个页数最多也就2^31。此外,使用如此巨大的缓冲区将面临根本不记录任何事件或记录任意事件的风险。