当 运行 dask 在本地机器上时的线程数和总体 cpu 利用率

Thread counts and overall cpu utilization when running dask on a local machine

我运行正在使用以下 single/local 机器设置进行任务:

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

如屏幕截图所示,dask 已检测到 8 个核心。物理机是 macbook procore i7,因此只有 4 个内核,但总共有 8 个超线程python无法区分内核和超线程。

现在,当 运行 执行 dask.bag.compute() 操作时,行为与预期的完全不同。而不是看到 8 个 个进程每个 1 个 线程 - 看看我们有什么:

10 到 12 个线程 每个 python 进程 为什么

我们来看看cpu利用率。这是 cpu load,由 Activity Monitor 报告 - 经过多年使用证明非常可靠: 特别是当我 运行 基于 jvm 的线程池或 standalone spark 时,它将可靠地显示非常接近 100% 的所有计算利用率资源(大约 800% cpu 负载)。下面我们看到更像是 45-55%:

所以问题是:

python 进程中的线程数与工作线程数不同,因为有一些线程用于其他 non-CPU-intensive 操作,例如与其他线程通信流程、诊断和服务仪表板。其他进程,例如您的客户所在的进程,可能会发生各种事情(一个裸 ipython 会话对我来说有 3 个线程)。

what might be preventing attainment of 100% of computing resources

很多东西!参考 best practices,您应该确保您的分区足够大,以便对它们进行计算所花费的时间比 per-task 开销长得多,但又不会大到使内存饱和。您在最后执行 .compute() ,此时所有剩余数据都传递给单个进程(客户端),如果您没有按大因素聚合,这可能是一个主要瓶颈。通常你希望像 .to_textfiles 这样的方法从工作进程写入而不是累积到客户端进程中。

core i7 has only two cores but a total of 8 hyperthreads

不是四核吗??请注意,OS 通常不区分逻辑内核、物理内核和离散处理器单元。 Python 只是从 OS 中获取信息。