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

2024-05-16 14:32:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

从截图中可以看出,dask检测到8个内核。物理机器是一个macbook procore i7的机器,因此只有四个核,但总共有八个超线程python无法区分内核和超线程。你知道吗

enter image description here

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

enter image description here

每个python进程有10到12个线程?为什么?你知道吗

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

enter image description here

所以问题是:

  • 为什么每个进程有这么多线程而不是一个
  • 什么可能阻止dask进程池获得100%的计算资源。你知道吗
  • 有没有办法组织使用dask.compute()来实现更高的利用率?你知道吗

Tags: 机器进程计算机利用率cpu线程内核dask
1条回答
网友
1楼 · 发布于 2024-05-16 14:32:30

python进程中的线程数与工作线程数不同,因为有些线程用于其他非CPU密集型操作,例如与其他进程通信、诊断和为仪表板提供服务。其他进程,比如您的客户机所在的进程,可能会发生各种各样的事情(对于我来说,一个裸ipython会话有3个线程)。你知道吗

what might be preventing attainment of 100% of computing resources

很多东西!关于best practices,您应该确保分区足够大,在分区上进行计算的时间比每个任务的开销要长得多,但不要太大,以致于占用内存。最后执行.compute(),此时所有剩余的数据都将传递给单个进程(客户机),如果没有按很大的因子进行聚合,这可能是一个主要的瓶颈。通常您希望像.to_textfiles这样的方法从worker写入,而不是累积到客户机进程中。你知道吗

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

不是四核??注意,操作系统通常不区分逻辑核、物理核和离散处理器单元。Python只是从操作系统获取信息。你知道吗

相关问题 更多 >