dask workers/cores/threads 的数量有限制吗?
are there any limits on number of the dask workers/cores/threads?
当我使用超过 25 个 worker,每个 worker 有 192 个线程时,我发现我的数据分析性能有所下降。调度程序有任何限制吗?通信上没有负载足迹(使用 ib)或 cpu 或 ram)。
例如,最初我在 lustrefs 上有 170K 个 hdf 文件:
ddf=dd.read_hdf(hdf5files,key="G18",mode="r")
ddf.repartition(npartitions=4096).to_parquet(splitspath+"gdr3-input-cache")
64 名工作人员的代码比 25 名工作人员的代码 运行 慢。看起来初始任务设计阶段的调度程序非常过载。
编辑:
dask-2021.06.0
分布式-2021.06.0
有很多潜在的瓶颈。这里有一些提示。
是的,调度程序是所有任务都必须通过的单个进程,并且它引入了每个任务的开销(<1ms)只是为了操纵其内部状态和发送。所以,如果你每秒有很多任务,你会发现开销占总时间的很大一部分。
同样,如果您有很多工作人员,您将有大量网络流量用于任务分配和工作人员之间的任何数据洗牌。更多工人,更多流量。
第三,python在运行代码中使用了全局锁GIL。即使您的任务对 GIL 友好(例如,array/dataframe ops),线程有时仍可能需要 GIL,这会导致争用和性能下降。
最后,您说您正在使用 lustre,因此您有许多任务同时访问网络存储,这对于元数据访问和数据流量都有其自身的限制。
当我使用超过 25 个 worker,每个 worker 有 192 个线程时,我发现我的数据分析性能有所下降。调度程序有任何限制吗?通信上没有负载足迹(使用 ib)或 cpu 或 ram)。 例如,最初我在 lustrefs 上有 170K 个 hdf 文件:
ddf=dd.read_hdf(hdf5files,key="G18",mode="r")
ddf.repartition(npartitions=4096).to_parquet(splitspath+"gdr3-input-cache")
64 名工作人员的代码比 25 名工作人员的代码 运行 慢。看起来初始任务设计阶段的调度程序非常过载。
编辑: dask-2021.06.0 分布式-2021.06.0
有很多潜在的瓶颈。这里有一些提示。
是的,调度程序是所有任务都必须通过的单个进程,并且它引入了每个任务的开销(<1ms)只是为了操纵其内部状态和发送。所以,如果你每秒有很多任务,你会发现开销占总时间的很大一部分。
同样,如果您有很多工作人员,您将有大量网络流量用于任务分配和工作人员之间的任何数据洗牌。更多工人,更多流量。
第三,python在运行代码中使用了全局锁GIL。即使您的任务对 GIL 友好(例如,array/dataframe ops),线程有时仍可能需要 GIL,这会导致争用和性能下降。
最后,您说您正在使用 lustre,因此您有许多任务同时访问网络存储,这对于元数据访问和数据流量都有其自身的限制。