想要设计一个远程
使用的计算密集型的并行调度器,可以并行运算大量计算密集型任务。目标CPU大概是18核36线程,4通道的机器。一个计算任务大概消耗1~10个核心不等,计算时间2分钟到数天不等,不过典型值大概是2-6个小时。进程池使用rayon
创建,大概的流程如下图所示,rayon主进程主要用来每120秒从数据库中提取未开始的任务并运行,rayon子进程都用于计算密集型任务:
开始=>start: 创建Rayon进程池(ThreadPoolBuilder)
结束=>end: 结束
更新=>operation: 更新任务数据库(sqlite db)
开启运行=>operation: 根据db和剩余线程数,开始新任务(pool.spawn)
沉睡=>operation: sleep(120)
开始->更新->开启运行->沉睡->更新
对于子线程每个任务,是异步进行的,运行时是tokio
,一边进行command
运行计算程序,一边每秒看看是否需要kill Command
。流程大概如下:
开始=>start: 开始tokio异步
结束=>end: 结束
select=>condition: select!(command, task.is_cancelled)
complete=>operation: 完成command
cancelled=>operation: 取消command
开始->select(yes)->complete->结束
select(no)->cancelled->结束
我上次做其他东西的时候,用了这个多进程调度模型,现在想求教各位大佬这个模型合理不?周期任务还有更好的办法么?我主进程只拿来做周期任务是不是会损失性能啊?另外tokio
每秒检查一次是否需要kill command
会不会有性能损失啊?
1
共 4 条评论, 1 页
评论区
写评论精彩的分析!感谢。已改成1秒sleep了。
--
👇
Neutron3529: 建议把
sleep(120)
改掉因为
sleep(1)
可以带来更大的优势sleep(120)
的期望是idle 60秒sleep(1)
的期望是idle 0.5秒,按每个任务平均6小时,使用sleep(120)
会浪费240秒,而sleep(1)
只会浪费2秒。算一下,用
sleep(1)
每天大概可以节省出238/86400=0.27%的性能而86400个sleep(1)绝对消耗不了238秒CPU时间
也就是,
sleep(120)
完全是浪费时间可以尝试一下。不过总感觉rayon做定时器,应该挺慢的。
--
👇
c5soft: 实践出真知,只有通过各种模型的实际测试才知道实际效果。比如只用Tokio,或者只用rayon呢?
建议把
sleep(120)
改掉因为
sleep(1)
可以带来更大的优势sleep(120)
的期望是idle 60秒sleep(1)
的期望是idle 0.5秒,按每个任务平均6小时,使用sleep(120)
会浪费240秒,而sleep(1)
只会浪费2秒。算一下,用
sleep(1)
每天大概可以节省出238/86400=0.27%的性能而86400个sleep(1)绝对消耗不了238秒CPU时间
也就是,
sleep(120)
完全是浪费时间实践出真知,只有通过各种模型的实际测试才知道实际效果。比如只用Tokio,或者只用rayon呢?