#tracing #tracing-subscriber #metrics

tracing-profile

基于span的性能分析器,使用tracing crate

5个版本 (破坏性更新)

0.6.0 2024年7月31日
0.4.0 2024年6月12日
0.3.0 2024年4月29日
0.2.0 2024年2月20日
0.1.0 2024年2月12日

#55 in 性能分析

Download history 280/week @ 2024-04-25 149/week @ 2024-05-02 162/week @ 2024-05-09 126/week @ 2024-05-16 362/week @ 2024-05-23 398/week @ 2024-05-30 483/week @ 2024-06-06 301/week @ 2024-06-13 260/week @ 2024-06-20 226/week @ 2024-06-27 197/week @ 2024-07-04 76/week @ 2024-07-11 82/week @ 2024-07-18 176/week @ 2024-07-25 213/week @ 2024-08-01 138/week @ 2024-08-08

每月下载 615

自定义许可

53KB
1K SLoC

tracing-profile

此库为tracing crate实现了订阅者,用于简化一次性程序执行的性能分析。也就是说,这个库不适用于长时间运行的程序的性能分析。

tracing-profile依赖于tracing-subscriber并实现了一层,用于测量、记录和显示span图中的时间信息。实现的tracing_subscriber::Layer记录span执行的时间,以及用户提供的任何元数据和从结果日志构建span图所需的信息。

注意,如果使用了#[tracing::instrument],建议使用skip_all参数。省略此参数会导致所有函数参数都被包括为字段。

使用方法

该库公开了两个层,以不同的方式输出信息。

特性标志

  • perf_counters启用PrintPerfCountersLayer层。目前性能计数器仅适用于Linux。

CsvLayer

CsvLayer将分析信息写入CSV文件,可以稍后通过重建span图进行分析。

$ cargo test
$ cat /tmp/output.csv
id,parent_id,elapsed_ns,span_name,file_name,call_depth,metadata
2,1,22837,child span1,src/lib.rs,2,{"field1":"value1"}
4,3,9255,child span3,src/lib.rs,3,{"field3":"value3"}
5,3,7135,child span4,src/lib.rs,3,{"field4":"value4"}
3,1,119802,child span2,src/lib.rs,2,{"field2":"value2"}
1,0,287881,root span,src/lib.rs,1,{}

PrintTreeLayer

PrintTreeLayer处理运行进程中的分析信息,并以人类可读的格式打印时间信息。输出将span图结构化为树状结构。

$ cargo test -- --nocapture
root span [ 112.67µs | 100.00% ]
├── child span1 [ 2.63µs | 2.33% ] { field1 = value1 }
└── child span2 [ 64.29µs | 57.06% ] { field2 = value2 }
   ├── child span3 [ 1.88µs | 1.66% ] { field3 = value3 }
   └── child span4 [ 1.67µs | 1.48% ] { field4 = value4 }

PrintPerfCountersLayer

PrintPerfCountersLayer在构建时接收事件向量(perf_event::events::Event)及其名称。在执行过程中,对每个span的每种给定事件的次数进行求和。结果以表格形式打印到标准输出。

perf_counters crate特性启用此功能。

$ cargo test -- --nocapture
child span4:
    instructions: 44142
    cycles: 34398
child span3:
    instructions: 44132
    cycles: 37674
child span2:
    instructions: 282256
    cycles: 272064
child span1:
    instructions: 49107
    cycles: 112554
root span:
    instructions: 661552
    cycles: 738894

IttApiLayer

IttApiLayer 在运行时为每个跨度添加一个 ittapi::Task,允许在 Intel VTune 分析器中观察跨度。有关参考,请参阅 ITT API 文档

ittapi 包功能启用了此功能。

示例测试

fn make_spans() {
    let span = debug_span!("root span");
    let _scope1 = span.enter();

    // child spans 1 and 2 are siblings
    let span2 = debug_span!("child span1", field1 = "value1");
    let scope2 = span2.enter();
    drop(scope2);

    let span3 = debug_span!("child span2", field2 = "value2");
    let _scope3 = span3.enter();

    // child spans 3 and 4 are siblings
    let span = debug_span!("child span3", field3 = "value3");
    let scope = span.enter();
    drop(scope);

    let span = debug_span!("child span4", field4 = "value4");
    let scope = span.enter();
    drop(scope);
}

#[test]
fn all_layers() {
    tracing_subscriber::registry()
        .with(PrintTreeLayer::default())
        .with(CsvLayer::new("/tmp/output.csv"))
        .init();
    make_spans();
}

配置

使用 PrintTreeConfig,您可以配置颜色和聚合/隐藏阈值。

#[test]
fn all_layers() {
    tracing_subscriber::registry()
        .with(PrintTreeLayer::new(PrintTreeConfig {
            attention_above_percent: 25.0,
            relevant_above_percent: 2.5,
            hide_below_percent: 1.0,
            display_unaccounted: false
        }))
        .with(CsvLayer::new("/tmp/output.csv"))
        .init();
    make_spans();
}

作者

tracing-profileUlvetanna 开发和维护。

许可证

MIT 许可证

版权所有 (c) 2024 Ulvetanna, Inc

特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供者提供软件的人行使其权利,前提是遵守以下条件

上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。

软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是由合同、侵权或其他原因引起的,与软件或软件的使用或其他方式相关。

依赖项

~1.2–1.6MB
~27K SLoC