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

2022-06-10 14:56:35 浏览数 (1)

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

Some notes on internal working of pprof-rs

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

profiling的基础知识

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

代码语言:javascript复制
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在程序开始时开始分析

代码语言:javascript复制
    let guard = pprof::ProfilerGuardBuilder::default()
        .frequency(100)
        .build()
        .unwrap();

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

代码语言:javascript复制
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进行可视化

代码语言:javascript复制
~/go/bin/pprof --http=localhost:8080  profile.pb

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

从可视化的概要文件中,您可以清楚地看到is_prime_number2is_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是一个自我托管的社交链接聚合和讨论平台。它是完全免费和开放的,不受任何公司的控制。这意味着没有广告、追踪或秘密算法。内容被组织到社区中,因此很容易订阅您感兴趣的主题,而忽略其他主题。投票是用来把最有趣的项目排在首位的。


From 日报小组 odd-cat

0 人点赞