码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 文盘 Rust -- tokio 绑定 cpu 实践


    tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢?这次我们来聊聊这个话题。

    首先我们先写一段简单的多任务程序。

    1. use tokio::runtime;
    2. pub fn main() {
    3. let rt = runtime::Builder::new_multi_thread()
    4. .enable_all()
    5. .build()
    6. .unwrap();
    7. rt.block_on(async {
    8. for i in 0..8 {
    9. println!("num {}", i);
    10. tokio::spawn(async move {
    11. loop {
    12. let mut sum: i32 = 0;
    13. for i in 0..100000000 {
    14. sum = sum.overflowing_add(i).0;
    15. }
    16. println!("sum {}", sum);
    17. }
    18. });
    19. }
    20. });
    21. }

    程序非常简单,首先构造一个 tokio runtime 环境,然后派生多个 tokio 并发,每个并发执行一个无限循环做 overflowing_add。overflowing_add 函数返回一个加法的元组以及一个表示是否会发生算术溢出的布尔值。如果会发生溢出,那么将返回包装好的值。然后取元祖的第一个元素打印。

    这个程序运行在 Ubuntu 20 OS,4 core cpu。通过 nmon 的监控如下:

    可以看到每个 core 都有负载。

    要想把负载绑定在某一 core 上,需要使用 core_affinity_rs。core_affinity_rs 是一个用于管理 CPU 亲和力的 Rust crate。目前支持 Linux、Mac OSX 和 Windows。官方宣称支持多平台,本人只做了 linux 操作系统的测试。

    我们把代码修改一下:

    1. use tokio::runtime;
    2. pub fn main() {
    3. let core_ids = core_affinity::get_core_ids().unwrap();
    4. println!("core num {}", core_ids.len());
    5. let core_id = core_ids[1];
    6. let rt = runtime::Builder::new_multi_thread()
    7. .on_thread_start(move || {
    8. core_affinity::set_for_current(core_id.clone());
    9. })
    10. .enable_all()
    11. .build()
    12. .unwrap();
    13. rt.block_on(async {
    14. for i in 0..8 {
    15. println!("num {}", i);
    16. tokio::spawn(async move {
    17. loop {
    18. let mut sum: i32 = 0;
    19. for i in 0..100000000 {
    20. sum = sum.overflowing_add(i).0;
    21. }
    22. println!("sum {}", sum);
    23. }
    24. });
    25. }
    26. });
    27. }

    在构建多线程 runtime 时,在 on_thread_start 设置 cpu 亲和。可以看到负载被绑定到了指定的 core 上。

    上面的代码只是把负载绑定到了一个 core 上,那么要绑定多个核怎么办呢?
    我们看看下面的代码

    1. pub fn main() {
    2. let core_ids = core_affinity::get_core_ids().unwrap();
    3. println!("core num {}", core_ids.len());
    4. let rt = runtime::Builder::new_multi_thread()
    5. .enable_all()
    6. .build()
    7. .unwrap();
    8. let mut idx = 2;
    9. rt.block_on(async {
    10. for i in 0..8 {
    11. println!("num {}", i);
    12. let core_id = core_ids[idx];
    13. if idx.eq(&(core_ids.len() - 1)) {
    14. idx = 2;
    15. } else {
    16. idx += 1;
    17. }
    18. tokio::spawn(async move {
    19. let res = core_affinity::set_for_current(core_id);
    20. println!("{}", res);
    21. loop {
    22. let mut sum: i32 = 0;
    23. for i in 0..100000000 {
    24. sum = sum.overflowing_add(i).0;
    25. }
    26. println!("sum {}", sum);
    27. }
    28. });
    29. }
    30. });
    31. }

    代码需要把所有负载绑在 core3 和 core4 上。原理是在派生任务中加入 core_affinity 设置。通过调整 idx,将派生并发平均绑定在指定的 core 上。代码运行的监控如下图。

  • 相关阅读:
    详细介绍:国产操作系统银行麒麟V10的下载和安装
    Spring Boot面试必问:启动流程
    antd中 a-table表格组件跨页勾选,数据回显勾选的问题
    Gradle系列——Gradle测试,Gradle生命周期,settings.gradle说明,Gradle任务(基于Groovy文档4.0.4)day2-3
    微软商店中的WSL预览版现已可用!Windows 11用户狂喜
    Leetcode3035. 回文字符串的最大数量
    某网站自动下载音乐mp3和歌词 离线音乐
    java计算机毕业设计果蔬在线销售系统源码+mysql数据库+系统+LW文档+部署
    Stable Diffusion 3正式发布,旨在巩固其在AI图像领域相对于Sora和Gemini的领先地位
    【C++风云录】发现天空之美:使用C++库进行气象图像处理与分析
  • 原文地址:https://blog.csdn.net/2301_78385600/article/details/132753584
  • 最新文章
  • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
    用 Hashids 优雅解决 C 端自增 ID 暴露问题
    V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
    LLVM Pass快速入门(四):代码插桩
    milkup:桌面端 markdown AI续写和即时渲染
    基于项目工程构建SBOM(软件物料清单)的研究
    鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
    .NET 中如何快速实现 List 集合去重?
    扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
    浅谈数据访问层
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号