1

我在 python 3.7 中使用多处理

一些文章说,池中要使用的进程数的一个好数字是 CPU 内核的数量。

我的 AMD Ryzen CPU 有 8 个内核,可以运行 16 个线程。

那么,进程数应该是 8 还是 16?

import multiprocessing as mp
pool = mp.Pool( processes = 16 )         # since 16 threads are supported?
4

1 回答 1

1

“那么,进程数应该是 8 还是 16?”


因此,如果子进程群分布式工作负载是缓存重用密集型(不是内存 I/O),则SpaceDOMAIN-constraints 规则,因为可缓存数据的大小将在决定是 8 还是 16 方面发挥重要作用.

为什么 ?
因为内存 I/O 的成本大约是缓存中数据的一千倍,因此每个内存 I/O的TimeDOMAIN费用大约是缓存中数据的一倍。3xx - 4xx [ns]0.1 ~ 0.4 [ns]

如何做出决定?
在决定生产规模配置之前进行小规模测试。


因此,如果将要分布的工作负载群是网络 I/O 或其他显着(本地非单一)延迟来源,则TimeDOMAIN可能会受益于延迟屏蔽技巧,运行 16、160 或仅1600 个线程(在这种情况下不是进程)。

为什么 ?
因为进行网络 I/O 的成本提供了如此多的等待时间(一些[ms]网络 I/O RTT 延迟时间足以处理1E7 ~ 10.000.000每个 CPU 核心 uop-s,这是相当大的很多工作。因此,甚至整个进程的智能交错,在这里也可能适合使用延迟屏蔽的基于线程的并发处理(因为线程等待来自网络 I/O 的远程“应答”不应该为 GIL 锁而战,因为在收到预期的 I/O 字节返回之前,它们没有什么可计算的,不是吗?)

如何做出决定?
查看代码以确定游戏中有多少通过网络 I/O 获取以及缓存占用大小大小的读取有多少(在 2020/Q2+ L1 缓存增长到大约几秒[MB])。对于这些操作重复多次的情况,请不要犹豫,为每个“慢”网络 I/O 目标启动一个线程,因为处理将受益于巧合创建的“长时间”等待的掩码 -时间成本只是便宜(“快”)和(由于“许多”和“长”等待时间)相当稀疏的线程切换,甚至是 O/S 驱动的进程调度程序将完整的子进程映射到一个免费的 CPU 内核。


因此,如果要分布的工作负载群是上述情况的某种混合,那么除了在实际的硬件本地/非本地资源上进行试验之外别无他法。

为什么 ?
因为没有经验法则可以微调工作负载处理到实际 CPU 核心资源的映射。


尽管如此,
人们可能很容易发现付出的代价比以往任何时候都多。实现减速
的已知陷阱,而不是(只是希望获得)加速

在所有情况下,根据修订后的 Amdahl 定律,开销严格、资源感知和工作负载原子性确定了收益递减点,在此之后,任何更多的工作人员 (CPU-core-s) 都不会提高获得Speedup的期望。获得 S << 1 的许多惊喜都在 Stack Overflow 帖子中表达,因此人们可以阅读尽可能多的不该做的事情(通过反模式学习)。

于 2020-05-26T09:39:28.530 回答