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 性能分析
每月下载 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-profile
由 Ulvetanna 开发和维护。
许可证
MIT 许可证
版权所有 (c) 2024 Ulvetanna, Inc
特此授予任何获得此软件及其相关文档副本(“软件”)的人免费使用软件的权利,不受任何限制,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,并允许向软件提供者提供软件的人行使其权利,前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或主要部分中。
软件按“原样”提供,不提供任何明示或暗示的保证,包括但不限于适销性、针对特定目的的适用性和非侵权性保证。在任何情况下,作者或版权所有者均不对任何索赔、损害或其他责任负责,无论这些索赔、损害或其他责任是由合同、侵权或其他原因引起的,与软件或软件的使用或其他方式相关。
依赖项
~1.2–1.6MB
~27K SLoC