在我阅读perf_event_open()
的{{3}}之后,我对捕获采样事件中的缓冲区大小提出了一些疑问。
在说明部分中,它说
采样事件会定期将测量值写入a 然后可以通过mmap(2)访问缓冲区。
当缓冲区溢出时,PMU将触发PMI,我们可以通过mmap()
系统调用访问缓冲区的内容。 (我的理解是正确的吗?)
但问题是,Perf缓冲区有多大?我可以设置一个新值(缓冲区长度)来覆盖它吗?
__u64 data_size
中的变量struct perf_event_mmap_page
仅表示此时的记录大小。
答案 0 :(得分:1)
当您说可以使用mmap
定期收集性能数据时,您的理解是正确的。
在开始之前,perf
使用两个缓冲区来记录不同类型的事件。 在主环缓冲区(环形缓冲区包含此辅助缓冲区)下使用辅助缓冲区来存储不同类型的事件信息。既然你问我关于主要的perf缓冲区,我会尝试回答这个问题。
您可以修改perf
缓冲区大小。根据文档,perf
缓冲区大小是根据页面定义的。它被定义为 1 + 2 ^ n 页面,其中需要一个页面来存储有关perf
使用的环形缓冲区的元数据。
当您尝试使用perf record
录制事件时,(阅读有关perf记录的联机帮助页),您将有一个开关-m
,可以指定将增加/减少的页数 perf环缓冲区。您指定的(mmap)页数必须是 2 的幂。(但是,您也可以直接指定大小)将页数增加1,将增加环形缓冲区大小 4kB (这是页面大小,在代码中指定为1<<<<< 12)。
但是,据我所知,这个页面的数量只会达到 2 ^ 31 。此外,使用如此庞大的缓冲区可能无法记录任何事件或记录任意事件。