关于pprof-rs内部工作原理的一些笔记
Some notes on internal working of pprof-rs
我们中的许多人都使用profiler来测量代码段所消耗的CPU或内存。为了了解profiling,作者摸索了一个流行的评测库pprof-rs,这个库用于测量rust程序的CPU使用率。
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文件:
从可视化的概要文件中,您可以清楚地看到is_prime_number2比is_prime_number1消耗了更多的cpu。这是因为使用is_prime_number1时,只有给定的数字可以被3整除。
现在,我们学习了如何使用pprof-rs分析rust程序,下面让我们了解pprof-rs如何在内部工作。
cpu profilers 要点
在我们进入pprof-rs代码之前,让我们从理论上学习cpu评测。
- profiler 在一定的时间间隔内暂停程序;
- 对当前堆栈跟踪进行采样后恢复;
- 采样时,它获取每个堆栈帧并增加其计数;
- 使用采样数据创建火焰图或类似的东西。
pprof-rs实现及其系统调用
- 开始分析
- 注册信号处理程序
- 指定时间间隔
- 处理SIGPROF信号
- 取样
- 绘图
原文: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 语言中文社区