当前位置 : 主页 > 编程语言 > java >

【Rust日报】2022-05-31 关于pprof-rs内部工作原理的一些笔记

来源:互联网 收集:自由互联 发布时间:2022-06-23
关于pprof-rs内部工作原理的一些笔记 Some notes on internal working of pprof-rs 我们中的许多人都使用profiler来测量代码段所消耗的CPU或内存。为了了解profiling,作者摸索了一个流行的评测库ppr

关于pprof-rs内部工作原理的一些笔记

Some notes on internal working of pprof-rs

我们中的许多人都使用profiler来测量代码段所消耗的CPU或内存。为了了解profiling,作者摸索了一个流行的评测库pprof-rs,这个库用于测量rust程序的CPU使用率。

【Rust日报】2022-05-31 关于pprof-rs内部工作原理的一些笔记_微信公众号

profiling的基础知识

让我们简要介绍一下rust程序示例,看看pprof是如何使用的。

fn main() {
let prime_numbers = prepare_prime_numbers();
// start profiling
let guard = pprof::ProfilerGuardBuilder::default()
.frequency(100)
.build()
.unwrap();
let mut v = 0;
for i in 1..50000 {
// use `is_prime_number1` function only if the incoming value
// i is divisable by 3.
if i % 3 == 0 {
if is_prime_number1(i, &prime_numbers) {
v += 1;
}
}
else {
if is_prime_number2(i, &prime_numbers) {
v += 1;
}
}
}
println!("Prime numbers: {}", v);
// stop profiling and generate the profiled report.
if let Ok(report) = guard.report().build() {
let mut file = File::create("profile.pb").unwrap();
let profile = report.pprof().unwrap();

let mut content = Vec::new();
profile.write_to_vec(&mut content).unwrap();
file.write_all(&content).unwrap();
};
}

在上面的示例中,我们使用​​ProfilerGuardBuilder​​在程序开始时开始分析

let guard = pprof::ProfilerGuardBuilder::default()
.frequency(100)
.build()
.unwrap();

在程序结束时,我们生成报告并将其写入​​profile.pb​​文件。

if let Ok(report) = guard.report().build() {
let mut file = File::create("profile.pb").unwrap();
let profile = report.pprof().unwrap();
let mut content = Vec::new();
profile.write_to_vec(&mut content).unwrap();
file.write_all(&content).unwrap();
};

该报告是通过运行该程序生成的,并使用谷歌的pprof进行可视化

~/go/bin/pprof --http=localhost:8080 profile.pb

执行上述命令后,pprof将允许您在 http://localhost:8080 可视化profile文件:

【Rust日报】2022-05-31 关于pprof-rs内部工作原理的一些笔记_堆栈_02

从可视化的概要文件中,您可以清楚地看到​​is_prime_number2​​​比​​is_prime_number1​​​消耗了更多的cpu。这是因为使用​​is_prime_number1​​时,只有给定的数字可以被3整除。

现在,我们学习了如何使用pprof-rs分析rust程序,下面让我们了解pprof-rs如何在内部工作。

cpu profilers 要点

在我们进入pprof-rs代码之前,让我们从理论上学习cpu评测。

  • profiler 在一定的时间间隔内暂停程序;
  • 对当前堆栈跟踪进行采样后恢复;
  • 采样时,它获取每个堆栈帧并增加其计数;
  • 使用采样数据创建火焰图或类似的东西。
  • 【Rust日报】2022-05-31 关于pprof-rs内部工作原理的一些笔记_微信公众号_03

pprof-rs实现及其系统调用

  • 开始分析
  • 注册信号处理程序
  • 指定时间间隔
  • 处理​​SIGPROF​​信号
  • 取样
  • 绘图

【Rust日报】2022-05-31 关于pprof-rs内部工作原理的一些笔记_微信公众号_04

原文:Some notes on internal working of profiler: https://inspektor.cloud/blog/how-profiler-works/

基于WASM的浏览器中的Lisp解释器

Lisp Interpreter in a browser using WASM: https://www.reddit.com/r/rust/comments/v1n5r6/lisp_interpreter_in_a_browser_using_wasm/

此网页在浏览器中托管一个Lisp解释器。解释器是用Rust编写的,并编译为WASM。解释器的实现可以在这里找到。可以在此处找到WASM绑定和此webapp的源代码。您可以通过在网页下面的文本框中键入代码来运行Lisp程序。

mail-send:一个支持DKIM的Rust电子邮件转发库

Announcing mail-send, a Rust e-mail delivery library with DKIM support

mail-send 于今天发布,它是 lettre 的替代品,但依赖性较少,并具有一些附加功能:

  • 生成符合互联网邮件格式标准(RFC 5322)的电子邮件;
  • 完全支持MIME(RFC 2045-2049),自动为每个消息正文部分选择最佳编码;
  • 域密钥识别邮件(DKIM)签名(RFC 6376);
  • SMTP支持;
  • 通过TLS安全交付;
  • 通过自动机制选择进行身份验证(支持XOAUTH2、CRAM-MD5、DIGEST-MD5、LOGIN和PLAIN);
  • 第三方电子邮件转发:

  • Mailchimp

  • Mailgun

  • 其他


  • 完全异步(需要Tokio,可根据要求添加其他执行器)。

除了这个库之外,您可能还想查看邮件解析器mail-parser(几个月前发布),它支持以41种不同编码解析MIME消息。

​​https://www.reddit.com/r/rust/comments/v127d0/announcing_mailsend_a_rust_email_delivery_library/​​

Lemmy v0.16.4 发布:Peertube 联邦、Rust API和其他改进

Lemmy (a federated reddit alternative) Release v0.16.4 - Peertube federation, Rust API and other improvements

Lemmy是一个自我托管的社交链接聚合和讨论平台。它是完全免费和开放的,不受任何公司的控制。这意味着没有广告、追踪或秘密算法。内容被组织到社区中,因此很容易订阅您感兴趣的主题,而忽略其他主题。投票是用来把最有趣的项目排在首位的。



社区学习交流平台订阅:

Rust.cc 论坛: 支持 rss

微信公众号:Rust 语言中文社区


上一篇:【Rust日报】2022-06-03 在 rust 中分析堆分配
下一篇:没有了
网友评论