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日

#101Unix API

Download history 173/week @ 2024-04-20 180/week @ 2024-04-27 83/week @ 2024-05-04 39/week @ 2024-05-11 20/week @ 2024-05-18 323/week @ 2024-05-25 79/week @ 2024-06-01 296/week @ 2024-06-08 41/week @ 2024-06-15 125/week @ 2024-06-22 19/week @ 2024-06-29 67/week @ 2024-07-06 64/week @ 2024-07-13 4/week @ 2024-07-20 131/week @ 2024-07-27 192/week @ 2024-08-03

每月405 次下载

MIT/Apache

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创建一个性能计数器,然后使用enabledisable来停止和启动计数。调用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