擅长:python、mysql、java
<p>首先对你的措辞稍作修改。一个CPU有不同的核心,每个核心都有超线程。每个超线程都是运行处理器的逻辑单元。亚马逊上有32个vCPU对应于超线程,而不是CPU或内核。这对这个问题并不重要,但只是为了以防万一,如果你做任何进一步的研究,重要的是要有正确的措辞。下面我将把hypertrade的这个“最低逻辑处理单元”称为vCPU</p>
<p>如果不指定池大小:</p>
<pre><code>p = multiprocessing.Pool()
p.map(os.system, cmdlist)
</code></pre>
<p>然后python将自己(通过<code>os.cpu_count()</code>)找出可用逻辑处理器(在您的例子中是32个vcpu)的数量。在</p>
<p>在正常情况下,所有32个进程都运行在单独的vcpu上,因为Linux试图平衡它们之间的负载。
但是,如果有其他重进程同时运行,那么两个进程可能在同一vCPU上运行。在</p>
<p>这里要理解的关键是Linux调度器是如何工作的:它定期重新调度进程,以便所有处理单元的利用率大致相同。这意味着,如果只启动16个进程,那么它们将分散到所有32个vCPU上,并利用它们大致相同(使用<code>htop</code>来查看负载是如何扩散的)。在</p>
<blockquote>
<p>And what happened if I set POOL_SIZE > # Processors (CPUs)?</p>
</blockquote>
<p>如果启动的进程多于可用的vCPU,则有几个进程需要共享一个vCPU。这意味着调度程序会在上下文切换中周期性地切换出一个进程。如果您的进程受CPU限制(使用100%的CPU,例如,当您进行数字运算时),那么拥有比vCPU更多的进程将减慢整个进程,因为您将有上下文开关减慢速度,并且如果您在进程之间有通信(不是在您的示例中,而是在执行多处理时通常会做的事情),则慢点。在</p>
<p>然而。如果您的进程不是CPU绑定的,但例如磁盘绑定(需要等待磁盘读/写)或网络绑定(例如,等待其他服务器应答),那么调度程序会将它们切换出去,以便为另一个进程腾出空间,因为它们无论如何都需要等待。在</p>