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

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

Some notes on internal working of pprof-rs

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

cae4aa1780c8f167060d34667959b67d.png

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文件:

4bd80d7e817e7dcb90f3931927c438db.png

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

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

cpu profilers 要点

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

  • profiler 在一定的时间间隔内暂停程序;

  • 对当前堆栈跟踪进行采样后恢复;

  • 采样时,它获取每个堆栈帧并增加其计数;

  • 使用采样数据创建火焰图或类似的东西。 

  • 51a19f74558a7edfe362548a313d4a15.png

pprof-rs实现及其系统调用

  • 开始分析

  • 注册信号处理程序

  • 指定时间间隔

  • 处理SIGPROF信号

  • 取样

  • 绘图

62859821f7a64a4bc0103f5125d3b3b4.png

原文: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

社区学习交流平台订阅:

Rust.cc 论坛: 支持 rss

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值