11个版本
0.7.4 | 2024年5月30日 |
---|---|
0.7.3 | 2024年5月26日 |
0.7.2 | 2023年10月22日 |
0.7.0 | 2023年7月25日 |
0.4.8 | 2023年4月20日 |
#101 在 Unix API
每月405 次下载
605KB
13K SLoC
perf-event:Linux性能监控的Rust接口
这个crate是Linux perf_event_open
API的包装器。它允许您访问Linux中可用的各种性能监控计数器。
这个crate是基于Jim Blandy的perf-event crate的一个分支,它已经被更新以支持更多
perf_event_open
API的功能。
入门指南
将以下内容添加到您的Cargo.toml
perf-event2 = "0.7"
使用Builder
创建一个性能计数器,然后使用enable
和disable
来停止和启动计数。调用read
来获取您的计数。如果您需要同时使用多个计数器,可以使用Group
。如果您想从内核中采样事件,请查看Sampler
。
示例
例如,这个示例计算了调用println!
所使用的循环数。尝试调整向量的长度,看看循环计数如何变化。
use perf_event::Builder;
use perf_event::events::Hardware;
fn main() -> std::io::Result<()> {
let mut counter = Builder::new(Hardware::INSTRUCTIONS).build()?;
let vec = (0..=51).collect::<Vec<_>>();
counter.enable()?;
println!("{:?}", vec);
counter.disable()?;
println!("{} instructions retired", counter.read()?);
Ok(())
}
examples
目录包含其他类型事件的计数程序。
perf-event2与perf-event之间的区别
perf-event2
支持与perf-event
相同的所有功能,但它还支持以下功能
- 直到Linux内核6.0引入的所有计数器选项。
- 创建一个
Group
来监控当前进程中的所有线程以外的任何内容。 - 通过内核采样事件(例如,收集堆栈跟踪等)。支持通过
perf-event-data
crate解析内核发出的记录。 - 直接访问内核暴露的底层
perf_event_attr
结构。
从 perf-event 迁移
perf-event2
v0.4.8与perf-event
v0.4.8完全相同。您只需在您的Cargo.toml
中替换perf-event -> perf_event2
即可继续使用,无需更改。但是,要获取新功能,您需要升级到v0.5或更高版本。
需要注意的主要变化是,现在Builder::new
直接接受事件。您之前可能这样做
let counter = Builder::new()
.kind(some_event)
// ...
.build()?
现在需要这样做
let counter = Builder::new(some_event)
// ...
.build()?;
请注意,如果您没有调用kind
,默认事件类型是Hardware::INSTRUCTIONS
。
另请参阅
- 原始的
perf-event
crate仍然可以根据您的用例正常工作。 - Markus Stange的
linux-perf-event-reader
允许您解析perf发出的记录,也应该允许您解析内核直接发出的记录。 perfcnt
crate提供了对perf_event_open
API的类似覆盖,并似乎支持解析内核发出的样本。not-perf
项目是用Rust重写的perf
,并包含大量处理Linux perf API的代码。
依赖项
~545KB
~11K SLoC