如果我的 8 核 CPU 支持 16 个线程,对于池中的进程数,16 是否比 8 更好?
If my 8 core CPU supports 16 threads, would 16 be a better number than 8 for number of processes in a Pool?
我在 python 3.7
中使用多处理
有人 articles 说 Pool 中使用的进程数是 CPU 核心数。
我的 AMD 锐龙 CPU 有 8 个内核,可以 运行 16 个线程。
那么,进程数应该是8个还是16个?
import multiprocessing as mp
pool = mp.Pool( processes = 16 ) # since 16 threads are supported?
Q : "So, should the number of processes be 8 or 16?"
因此,如果子进程群分布式工作负载是缓存重用密集型(而不是 memory-I/O),SpaceDOMAIN
-约束规则,因为可缓存数据的大小将在决定是 8 还是 16 时发挥主要作用。
为什么?
因为 memory-I/O 的成本大约是 TimeDOMAIN
的一千倍,每 memory-I/O 支付大约 3xx - 4xx [ns]
,相比之下0.1 ~ 0.4 [ns]
缓存数据。
如何做出决定?
在决定生产规模配置之前进行小规模测试。
因此,如果待分配的工作负载群是 network-I/O 或其他显着的(局部非奇异的)延迟源,则 TimeDOMAIN
可能会受益于延迟屏蔽技巧,运行 16、160 或仅 1600 个线程(在这种情况下不是进程)。
为什么?
因为过度 network-I/O 的成本提供了如此多的等待时间(一些 [ms]
的 network-I/O RTT 延迟时间足以完成 1E7 ~ 10.000.000
每个 CPU-core uop-s,这是相当多的工作。因此,甚至整个进程的智能交错,这里也只使用延迟屏蔽的基于线程的并发处理可能合适(因为等待来自 network-I/O 的远程“答案”的线程不应该为 GIL 锁而战,因为它们在收到预期的 I/O-bytes 返回之前没有什么可计算的, 有吗?)
如何做出决定?
查看代码以确定游戏中有多少次 network-I/O 获取以及缓存足迹大小的读取(在 2020/Q2+ L1 缓存增长到大约几个 [MB]
-秒)。对于这些操作重复多次的情况,请毫不犹豫地为每个“慢”network-I/O 目标启动一个线程,因为处理将受益于巧合创建的“长”等待屏蔽 -以廉价(“快速”)和(由于“许多”和“长”等待时间)相当稀疏的线程切换或什至 O/S-driven 进程调度程序将完整的子进程映射到免费 CPU-core.
因此,如果要分发的工作负载群是上述情况的某种混合,除了在实际硬件本地/非本地资源上进行实验之外别无他法。
为什么?
因为没有经验法则来微调工作负载处理到实际 CPU 核心资源的映射。
不过,
人们可能很容易发现付出的代价比以往任何时候都多
实现减速[=80]的已知陷阱
=],而不是 (只是希望得到) SpeedUp
在所有情况下,关于 revised Amdahl's Law 的工作负载的开销严格、资源感知和原子性确定了一个 递减点 returns,之后,任何更多的工人(CPU-core-s)都不会提高希望获得Speedup。获得 S << 1 的许多惊喜都在 Stack Overflow 帖子中表达,因此人们可以阅读尽可能多的不该做的事情(通过反模式学习) 如大家所愿。
我在 python 3.7
中使用多处理有人 articles 说 Pool 中使用的进程数是 CPU 核心数。
我的 AMD 锐龙 CPU 有 8 个内核,可以 运行 16 个线程。
那么,进程数应该是8个还是16个?
import multiprocessing as mp
pool = mp.Pool( processes = 16 ) # since 16 threads are supported?
Q : "So, should the number of processes be 8 or 16?"
因此,如果子进程群分布式工作负载是缓存重用密集型(而不是 memory-I/O),SpaceDOMAIN
-约束规则,因为可缓存数据的大小将在决定是 8 还是 16 时发挥主要作用。
为什么?
因为 memory-I/O 的成本大约是 TimeDOMAIN
的一千倍,每 memory-I/O 支付大约 3xx - 4xx [ns]
,相比之下0.1 ~ 0.4 [ns]
缓存数据。
如何做出决定?
在决定生产规模配置之前进行小规模测试。
因此,如果待分配的工作负载群是 network-I/O 或其他显着的(局部非奇异的)延迟源,则 TimeDOMAIN
可能会受益于延迟屏蔽技巧,运行 16、160 或仅 1600 个线程(在这种情况下不是进程)。
为什么?
因为过度 network-I/O 的成本提供了如此多的等待时间(一些 [ms]
的 network-I/O RTT 延迟时间足以完成 1E7 ~ 10.000.000
每个 CPU-core uop-s,这是相当多的工作。因此,甚至整个进程的智能交错,这里也只使用延迟屏蔽的基于线程的并发处理可能合适(因为等待来自 network-I/O 的远程“答案”的线程不应该为 GIL 锁而战,因为它们在收到预期的 I/O-bytes 返回之前没有什么可计算的, 有吗?)
如何做出决定?
查看代码以确定游戏中有多少次 network-I/O 获取以及缓存足迹大小的读取(在 2020/Q2+ L1 缓存增长到大约几个 [MB]
-秒)。对于这些操作重复多次的情况,请毫不犹豫地为每个“慢”network-I/O 目标启动一个线程,因为处理将受益于巧合创建的“长”等待屏蔽 -以廉价(“快速”)和(由于“许多”和“长”等待时间)相当稀疏的线程切换或什至 O/S-driven 进程调度程序将完整的子进程映射到免费 CPU-core.
因此,如果要分发的工作负载群是上述情况的某种混合,除了在实际硬件本地/非本地资源上进行实验之外别无他法。
为什么?
因为没有经验法则来微调工作负载处理到实际 CPU 核心资源的映射。
不过,
人们可能很容易发现付出的代价比以往任何时候都多
实现减速[=80]的已知陷阱
=],而不是 (只是希望得到) SpeedUp
在所有情况下,关于 revised Amdahl's Law 的工作负载的开销严格、资源感知和原子性确定了一个 递减点 returns,之后,任何更多的工人(CPU-core-s)都不会提高希望获得Speedup。获得 S << 1 的许多惊喜都在 Stack Overflow 帖子中表达,因此人们可以阅读尽可能多的不该做的事情(通过反模式学习) 如大家所愿。