< 返回版块

eweca-d 发表于 2022-05-01 19:37

想要设计一个远程使用的计算密集型的并行调度器,可以并行运算大量计算密集型任务。目标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会不会有性能损失啊?

评论区

写评论
作者 eweca-d 2022-05-02 11:25

精彩的分析!感谢。已改成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)完全是浪费时间

作者 eweca-d 2022-05-02 11:24

可以尝试一下。不过总感觉rayon做定时器,应该挺慢的。

--
👇
c5soft: 实践出真知,只有通过各种模型的实际测试才知道实际效果。比如只用Tokio,或者只用rayon呢?

Neutron3529 2022-05-02 00:57

建议把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)完全是浪费时间

c5soft 2022-05-01 22:09

实践出真知,只有通过各种模型的实际测试才知道实际效果。比如只用Tokio,或者只用rayon呢?

1 共 4 条评论, 1 页