问一些对虚拟化的认知: ESXi 的虚拟化把一个不支持多线程的程序的负载均匀分布在多个处理器上

讨论 未结 6 65
phpfpm
phpfpm 会员 2022年7月4日 16:27 发表
<p>感觉好牛逼啊</p> <p>找了一个比较简单无脑的程序测一下单核性能:</p> <p><code>echo scale=5000; 4*a(1) | bc -l -q</code></p> <p>用的是 windows 版的二进制的 bc 的 bin(GNU),这个性能不是很好,但是横评比较方便。</p> <p>结果大概是这样:</p> <pre><code class="language-php"> 时间 主频 i5 2500k 23.48 3.3 e5 2630 29.5 2.3 i5 6200U 26.76 2.4 e3 1231v3 21.02 3.4 </code></pre> <p>基本上,耗时的秒数( s) x 主频(GHz) = 80G</p> <p>所以能拿到的一些基本认知:</p> <ol> <li>ESXi 的虚拟化,如果节点运行的是没有给多 CPU 优化的程序,可以通过虚拟化的层面调度到多个 CPU</li> <li>单个线性程序仍然不能并行,运行的时间和单核主频负相关</li> <li>衡量虚拟化物理机的 cpu 容量用主频 x 物理核数是合理的</li> <li>超线程似乎在虚拟化这边用处不大,虚拟化相当于是一个横跨多核的超线程(?)</li> <li>当然,要跑得快,主频还是得要高</li> </ol> <p>想问下这些理解对不对呢?谢谢</p>
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
6个回复
  • msg7086
    2022年7月4日 16:57
    调度到多个核心不需要虚拟化,操作系统的线程调度就可以做到。 核心之间的调度需要考虑到 CPU 内缓存命中的问题和单核 Turbo 性能的问题。 比如说跨 NUMA 调度,跨 CCX 调度等等。 Turbo 的话,根据 CPU governor 的不同,频率切换速度也不同。比如单核 5G 然后其他核 4G ,调度到别的核心后,需要把 5G 的核心降速,4G 的核心提速。来回切换的速度会影响运行效率。所以有些单核应用,锁核心以后运行速度会大幅提高。
    0 0
  • phpfpm
    2022年7月4日 16:57
    但是如果一个单线程的程序,没有任何多核优化的,也能调度到多个 cpu 么?
    0 0
  • msg7086
    2022年7月4日 17:27
    现在的操作系统内核本来就是按时间片分配资源,不会绑定到核心的。 单线程程序在运行的时候,同一时间只会问操作系统要一份时间片。操作系统随机分配某个核心的一段时间给程序执行。优化过的线程调度器可能会更偏向于把同一个核心分给同一个线程,但并不是硬性要求。 有些调度器可能会故意分散压力来降低 CPU 温度;有些则会故意集中压力来提高运行性能。 不管是哪种情况,一个线程都不需要运行在同一个核心上。
    0 0
  • LeeReamond
    2022年7月4日 17:27
    不是很理解 lz 描述的没有给"多 cpu 优化"的可以通过虚拟化解决,以及单线程还是单线程
    0 0
  • phpfpm
    2022年7月4日 17:27
    @ 我懂了。。。 之前一直以为一个单线程的程序一定始终绑定固定的内核。
    0 0
  • GeruzoniAnsasu
    2022年7月4日 17:57
    几乎没有对的…… 单线程程序你可以理解为无论有多少个 CPU 都只能利用其中一个,用哪个 CPU 不是程序决定的,是 OS 决定的。在过去 OS 就是 OS 内核本身;虚拟化时代,所有的现代 OS 都有 hypervisor+内核两部分,在虚拟机中运行时 OS 能检测硬件环境以决定使用自己的 hypervisor 还是虚拟化环境里的。exsi 只有 hypervisor ,没有 OS 内核,而例如 windows 则既有内核(传统的 windows 内核)也有 hypervisor ( hyper-v ,当你启用 hyper-v 组件的时候 windows 会把自己也交给 hyper-v 调度) 超线程是硬件层面的线程机制,打个比方切换线程时要保存上下文,上下文里包括算数寄存器、内存指针(栈寄存器)、程序指针( PC )之类的值,软件实现的机制是 OS kernel 打断用户程序的执行然后把这些寄存器的值找块内存放起来,而硬件实现则可以直接换一组寄存器给线程使用。CPU 体系结构里有个概念叫 register file ,x86 cpu 算数寄存器大概 10 几个,但是算数寄存器的 registry file 有上百个大,也就是说 CPU 内部能保存十几个同一寄存器值的副本随时切换。当你软件切换线程上下文还在等内存写入的时候硬件只需要换一下寄存器映射几乎瞬间就完成了,这就是超线程加速的基本原理。 然后再说说主频问题,商用 CPU 和个人终端产品 CPU 在功耗、性能调度上会有很大区别,并不能简单地认为主频越高越快。主频越高能带来更短的指令周期,但内存延迟、睿频、流水线长度、功耗控制……即使不考虑多核性能,都仍有非常多变量因素产生影响。 只能说控制单一变量只有主频变化的时候程序执行时间与主频负相关,但这是正确的废话
    0 0