文盘Rust -- tokio绑定cpu实践 天天观点
tokio 是 rust 生态中流行的异步运行时框架。在实际生产中我们如果希望 tokio 应用程序与特定的 cpu core 绑定该怎么处理呢?这次我们来聊聊这个话题。
(资料图片仅供参考)
首先我们先写一段简单的多任务程序。
use tokio::runtime;pub fn main() { let rt = runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap(); rt.block_on(async { for i in 0..8 { println!("num {}", i); tokio::spawn(async move { loop { let mut sum: i32 = 0; for i in 0..100000000 { sum = sum.overflowing_add(i).0; } println!("sum {}", sum); } }); } });}程序非常简单,首先构造一个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 操作系统的测试。
我们把代码修改一下:
use tokio::runtime;pub fn main() { let core_ids = core_affinity::get_core_ids().unwrap(); println!("core num {}", core_ids.len()); let core_id = core_ids[1]; let rt = runtime::Builder::new_multi_thread() .on_thread_start(move || { core_affinity::set_for_current(core_id.clone()); }) .enable_all() .build() .unwrap(); rt.block_on(async { for i in 0..8 { println!("num {}", i); tokio::spawn(async move { loop { let mut sum: i32 = 0; for i in 0..100000000 { sum = sum.overflowing_add(i).0; } println!("sum {}", sum); } }); } });}在构建多线程runtime时,在on_thread_start 设置cpu亲和。可以看到负载被绑定到了指定的core上。
上面的代码只是把负载绑定到了一个core上,那么要绑定多个核怎么办呢?我们看看下面的代码
pub fn main() { let core_ids = core_affinity::get_core_ids().unwrap(); println!("core num {}", core_ids.len()); let rt = runtime::Builder::new_multi_thread() .enable_all() .build() .unwrap(); let mut idx = 2; rt.block_on(async { for i in 0..8 { println!("num {}", i); let core_id = core_ids[idx]; if idx.eq(&(core_ids.len() - 1)) { idx = 2; } else { idx += 1; } tokio::spawn(async move { let res = core_affinity::set_for_current(core_id); println!("{}", res); loop { let mut sum: i32 = 0; for i in 0..100000000 { sum = sum.overflowing_add(i).0; } println!("sum {}", sum); } }); } });}代码需要把所有负载绑在 core3和core4上。原理是在派生任务中加入 core_affinity 设置.通过调整idx,将派生并发平均绑定在指定的core上。代码运行的监控如下图。
本期关于cpu亲和的话题就聊到这儿,下期见
作者:京东科技 贾世闻
来源:京东云开发者社区
关键词:
上一篇:观点:学校教育教学经验交流发言稿
下一篇:最后一页
- 文盘Rust -- tokio绑定cpu实践 天天观点
- 观点:学校教育教学经验交流发言稿
- 快资讯丨花生:消化库存为主,关注河南麦茬播种进度
- 一孩生育率跌至0.5,50%女性终生不育?谨慎解读数据细节
- 2023全国英式7人制橄榄球锦标赛在杭州闭幕-每日热点
- 北大自杀女生包丽男友牟某翰涉嫌虐待罪案,将于6月7日宣判_天天报道
- 网友发布“三亚被宰记”,三亚通报调查情况
- 自耦电源变压器的输出端指示电压为零时表示是什么_自耦电源变压器的输出端指示电压为零时安全吗 全球速看
-
世界三大男高音是哪三位_世界三大男高音_世界头条
1、区别如下:1 国籍不同:卢恰诺·帕瓦罗蒂是意大利人,普拉西多·多明戈、何塞·卡雷拉斯都是西班牙人。2
-
灵山县新洲中学_关于灵山县新洲中学介绍
1、灵山县新洲中学是县直属的一所高级中学,位于县城南郊,环境幽雅,地理位置优越,毗邻县二运站。校园面
-
世界今亮点!英国首相苏纳克希望与拜登建立“密切而坦诚的关系”
中新社伦敦6月4日电在访美前夕,英国首相苏纳克表示,希望在访问华盛顿期间与美国总统拜登建立“密切而坦诚
-
10mm钢板重量计算公式_钢板比重
1、同样材质的钢板的比重不会变,和厚度没有关系。2、10mm厚钢板的比重7850kg m³,每平方米理论重量78 5kg
X 关闭
X 关闭




