什么是Perf缓冲区大小?

时间:2017-06-16 08:27:14

标签: c linux-kernel cpu perf

在我阅读perf_event_open()的{​​{3}}之后,我对捕获采样事件中的缓冲区大小提出了一些疑问。

在说明部分中,它说

  

采样事件会定期将测量值写入a          然后可以通过mmap(2)访问缓冲区。

当缓冲区溢出时,PMU将触发PMI,我们可以通过mmap()系统调用访问缓冲区的内容。 (我的理解是正确的吗?)

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

__u64 data_size中的变量struct perf_event_mmap_page仅表示此时的记录大小。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

但是,据我所知,这个页面的数量只会达到 2 ^ 31 。此外,使用如此庞大的缓冲区可能无法记录任何事件或记录任意事件。