我正在使用以下单个/本地计算机设置来运行dask:
ClusterWorkers=8
ThreadPerWorker=1
cluster = LocalCluster(n_workers=ClusterWorkers, threads_per_worker=ThreadPerWorker)
client = Client(cluster)
从屏幕快照中可以看到,dask
已检测到8个核心。物理计算机是具有macbook pro
的{{1}},因此只有四个内核,但总共有 8个超线程。 python 无法区分内核和超线程。
现在,当运行core i7
操作时,其行为与预期的完全不同。而不是看到每个都有一个一个线程的八个进程-看看我们拥有什么:
10到12 个线程 ? 为什么?
让我们看一下 cpu利用率。这是 Activity Monitor 报告的 cpu负载-经过多年使用证明,它非常可靠:尤其是当我运行 jvm 基于线程池或独立火花,它将可靠地显示所有计算资源的利用率接近100%(大约800%cpu负载)。下面我们看到的像是45-55%:
所以问题是:
dask.bag.compute()
的使用以实现更高的利用率?答案 0 :(得分:0)
python进程中的线程数与辅助线程数不同,因为有一些线程用于其他非CPU密集型的操作,例如与其他进程通信,诊断和服务仪表板。其他进程(例如您的客户端所居住的进程)可能会发生各种变化(一个简单的ipython会话对我来说有3个线程)。
什么可能阻止了100%的计算资源的实现
很多东西!参考best practices,您应确保分区足够大,以使分区上的计算所需的时间比每个任务的开销长得多,但又不要太大,以至于导致内存饱和。最后,您执行.compute()
,此时所有剩余数据都传递给单个进程(客户端),如果您未进行较大的汇总,则这可能是主要瓶颈。通常,您希望像.to_textfiles
这样的方法从工作程序中写入而不是累积到客户端进程中。
核心i7只有两个核心,但共有8个超线程
不是四个核心???请注意,操作系统通常不会区分逻辑核心,物理核心和离散处理器单元。 Python只是从操作系统中获取信息。