我在 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?
我在 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?
问:“那么,进程数应该是 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 帖子中表达,因此人们可以阅读尽可能多的不该做的事情(通过反模式学习)。