在本地计算机上运行dask时,线程数和总体cpu利用率

时间:2019-05-23 04:32:37

标签: python dask dask-distributed

我正在使用以下单个/本地计算机设置来运行dask:

ClusterWorkers=8
ThreadPerWorker=1
cluster = LocalCluster(n_workers=ClusterWorkers, threads_per_worker=ThreadPerWorker)
client = Client(cluster)

从屏幕快照中可以看到,dask已检测到8个核心。物理计算机是具有macbook pro的{​​{1}},因此只有四个内核,但总共有 8个超线程 python 无法区分内核和超线程。

enter image description here

现在,当运行core i7操作时,其行为与预期的完全不同。而不是看到每个都有一个一个线程的八个进程-看看我们拥有什么:

enter image description here

每个Python进程

10到12 个线程 为什么

让我们看一下 cpu利用率。这是 Activity Monitor 报告的 cpu负载-经过多年使用证明,它非常可靠:尤其是当我运行 jvm 基于线程池或独立火花,它将可靠地显示所有计算资源的利用率接近100%(大约800%cpu负载)。下面我们看到的像是45-55%:

enter image description here

所以问题是:

  • 为什么有这么多线程,而不是每个进程只有一个
  • 什么会阻止dask进程池获得100%的计算资源。
  • 是否有方法来组织dask.bag.compute()的使用以实现更高的利用率?

1 个答案:

答案 0 :(得分:0)

python进程中的线程数与辅助线程数不同,因为有一些线程用于其他非CPU密集型的操作,例如与其他进程通信,诊断和服务仪表板。其他进程(例如您的客户端所居住的进程)可能会发生各种变化(一个简单的ipython会话对我来说有3个线程)。

  

什么可能阻止了100%的计算资源的实现

很多东西!参考best practices,您应确保分区足够大,以使分区上的计算所需的时间比每个任务的开销长得多,但又不要太大,以至于导致内存饱和。最后,您执行.compute(),此时所有剩余数据都传递给单个进程(客户端),如果您未进行较大的汇总,则这可能是主要瓶颈。通常,您希望像.to_textfiles这样的方法从工作程序中写入而不是累积到客户端进程中。

  

核心i7只有两个核心,但共有8个超线程

不是四个核心???请注意,操作系统通常不会区分逻辑核心,物理核心和离散处理器单元。 Python只是从操作系统中获取信息。