V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
chackchackGO
V2EX  ›  问与答

vmware 中给 VM 设置 cpu 如何设置才是合理的?

  •  
  •   chackchackGO · 2022-09-06 11:55:18 +08:00 · 5704 次点击
    这是一个创建于 816 天前的主题,其中的信息可能已经有所发展或是发生改变。

    针对大多数家用台式电脑或笔记本的这种单 CPU 情况而言, 如何设置最好?
    之所以这么问是因为我一直不能完全理解 'Number of processors' 和 'Number of cores per processor'这 2 个字段的意义.

    我本以为是 'Number of processors' 指 '完整的一块物理 CPU' 的数量, 例如一颗 Intel I7-9750H CPU 就代表一块.
    'Number of cores per processor' 即指代针对每块物理 cpu 所共享给虚拟机的核心数量. 例如 6 核的 I7-9750H 我可以共享出去 1~6 核.
    但是学长跟我讲不是这样理解的..涉及到 NUMA 之类的较深层的 cpu 概念. 听的我云里雾里,而且搜到的资料也不多的样子.

    vm 的 cpu 设置截图 按照上图设置之后的 win10 虚拟机仍然操作不流畅, 其余设置是 8G 内存和 100G 的 nvme 固态

    23 条回复    2022-09-07 10:04:25 +08:00
    FrankAdler
        1
    FrankAdler  
       2022-09-06 12:54:28 +08:00
    你理解的是对的,虚拟几个 cpu 然后每个 cpu 的核数,截图里 4 和 1 调换下
    你学长是在吹牛逼吗还是觉得自己知道的多强行在这个场景炫技?
    chackchackGO
        2
    chackchackGO  
    OP
       2022-09-06 14:09:03 +08:00
    @FrankAdler 实际测试了一下(切换设置并用 cpu-z 跑分), 的确是按照我的理解才正确. 感谢.
    不过忘记了提了一个问题: 针对支持超线程的 cpu, 可给虚拟机分配的 cores 数量是物理 cores*2 对吗?
    ysc3839
        3
    ysc3839  
       2022-09-06 15:22:15 +08:00
    我自己是把虚拟机的核心数设置成宿主机的线程数,不确定这么做会不会因为虚拟机内系统无法看到 CPU 线程导致调度策略不好,但是如果不设置成线程数的话等于超线程没有被利用了。
    iloveayu
        4
    iloveayu  
       2022-09-06 17:16:23 +08:00   ❤️ 1
    这个 Processors 选项配置,是指你创建的虚拟机,虚拟出的硬件 CPU 规格是什么样的。
    Number of processors ,这个是指你要给你的虚拟机,虚拟出多少颗 CPU ,表现在 Windows 操作系统上,就是系统信息 CPU 描述里的 Socket 数量。
    Number of cores 1 cpu ,这个是指,你虚拟出来的虚拟硬件,每颗 CPU 上有多少个核心(和宿主机有无超线程无关)。
    如果按照你截图种的配置,那么你安装完 win10 后,在系统信息里,可以看到 4 核心 4 个 socket 的字样。
    如果调换这两个配置,你创建出的虚机,更符合一台 PC 的真实状况,也就是单路 4 核。
    这两种配置方式,在 guest vm 里任务管理器里数框框,都是 4 个框。
    如果宿主机是 i7-9750h ( 6c12t ),开了超线程的情况下,total processor cores ,最大不能超过 12 。
    所以如果你想获得比较好的虚拟机 CPU 性能,可以考虑 1x8 都是可以的。
    另外,“win10 虚拟机仍然操作不流畅”,这说明你用的是真的 VMware Workstation ,卡就对啦,VMware tools 3D 性能不行,厂商也不想优化没办法。
    cubecube
        5
    cubecube  
       2022-09-06 17:23:14 +08:00
    1,4 和 4,1 效果是一样的。之前看过文档
    chackchackGO
        6
    chackchackGO  
    OP
       2022-09-06 17:32:57 +08:00
    @iloveayu 按照 4 processors, 1 core 的设置 任务管理器里显示的是 2 sockets, 2 virtual processors. windows 好怪哦
    FrankAdler
        7
    FrankAdler  
       2022-09-06 17:36:24 +08:00   ❤️ 1
    @chackchackGO 是可以按照超线程的数量来分配的,比如我 6c12t ,虚拟机编译的时候分配 12c ,宿主机里全部跑满全部框框
    icyalala
        8
    icyalala  
       2022-09-06 17:37:23 +08:00   ❤️ 1
    虽然你也基本没说错,但建议还是了解一下 NUMA 概念和 Windows Processor Groups:
    https://www.nakivo.com/blog/the-number-of-cores-per-cpu-in-a-virtual-machine/
    Windows 不同版本支持的 CPU socket 上限也是不一样的
    chackchackGO
        9
    chackchackGO  
    OP
       2022-09-06 17:39:07 +08:00
    @cubecube 麻烦指路一下文档地址.

    我用 cpuz 测试了一下, [1,4] 的多核分数是 [4,1] 的 2 倍.
    shika
        10
    shika  
       2022-09-06 17:47:09 +08:00 via Android
    在 ESXi 中,我一般只设置总的 vCPU 数,但两种方式确实可以手动指定的,有什么区别没深究,有空我测试一下看看
    shika
        11
    shika  
       2022-09-06 17:55:17 +08:00 via Android   ❤️ 1
    确定的一件事是 windows 非 server 版的系统比如 win10 专业版是不支持超过两个处理器的,所以只能设置 2 个处理器,然后每个处理器再设置多少个核心。esxi 会根据你选择的操作系统版本自动设置好,只需要设置总的 vcpu 数量。
    shika
        12
    shika  
       2022-09-06 18:03:53 +08:00 via Android
    @chackchackGO 1,4 的性能是 4,1 的两倍这种应该是不太对的,是不是因为 win10 只支持两个处理器的关系
    iloveayu
        13
    iloveayu  
       2022-09-06 18:55:05 +08:00 via iPhone
    @chackchackGO win10 版本的限制,home 最大支持 1 socket ,pro ent 和 edu 是 2 ,工作站版 是 4
    chackchackGO
        15
    chackchackGO  
    OP
       2022-09-06 19:31:33 +08:00   ❤️ 1
    @shika 我又测试了一下, 看来是的, 分数相差无几.
    ysc3839
        16
    ysc3839  
       2022-09-06 19:32:17 +08:00
    @cubecube 我比较怀疑是会影响调度的,因为在实际硬件上多 CPU 会因为跨 CPU 通信等问题性能不如多核,可能会影响调度器策略,进而影响最终性能。
    wangyuyang3
        17
    wangyuyang3  
       2022-09-06 19:46:08 +08:00 via Android
    实测和楼主结果差不多,总线程数一致的情况下,VMware 虚拟机分配“一处理器多内核”比“多处理器一内核”要好得多,在 Linux 系统也是如此。应该就是调度问题。

    至于 NUMA 概念,应该主要是为了进一步了解 VMware 提供这种配置选项的原因。不过一般只有服务器 cpu 和多 cpu 平台会涉及到这个领域?

    另外 Intel 12 代出现大小核架构以后,VMware 目前调度依旧存在极大问题,无论怎么设置虚拟机 cpu 核心数,都会把主要负载放在小核,进一步导致宿主机卡顿。这个时候设置 cpu 核心数的上限最好剔除掉小核所占的数量,然后任务管理器或 process lasso 设置一下 cpu 相关性,排除 VMware 对小核的调用。
    chackchackGO
        18
    chackchackGO  
    OP
       2022-09-06 20:43:49 +08:00
    @wangyuyang3

    你在 linux 里怎么测试的?
    我为了印证 5 楼 cubecube 的说法, 在 15 楼用 [1, 2] 和 [2, 1] 在 cpu-z 中测试多核分数相差无几. 所以都要相信 5 楼 '两者对调效果一致'的说法了.
    可能因为核心数太少了所以分数差别不明显?

    linux 里我刚刚尝试用 cpu-x 测试到中途发现它对于 '多处理器, 单核心'的情况下只能对一个 thread 进行 prime numbers 的 bench..所以就一筹莫展了.
    iloveayu
        19
    iloveayu  
       2022-09-06 21:11:40 +08:00   ❤️ 1
    @chackchackGO 性能上是否有影响,还得看具体的工作负载,有些情况下,NUMA 后的性能的确是有提升的,需要故意虚拟更多的插槽,减少每插槽上 vCPU 的数量,VMware 的人还有发过 Blog (注意日期,现在不一定又多了多少坑),
    https://blogs.vmware.com/vsphere/2013/10/does-corespersocket-affect-performance.html
    其实就日常个人使用,VMware Workstation 的情况下,差别不大,估计 VMware workstation 也没对这地方做什么特殊处理,只是模拟环境。
    这种情况一般是企业内部,使用 vsphere 全家桶时遇到性能问题才考虑的。
    实际场景有些工业相关软件,还有按 server 的 socket 数收 license 钱的奇葩情况呢。
    ragnaroks
        20
    ragnaroks  
       2022-09-06 21:46:22 +08:00
    @wangyuyang3
    vmx 可以使用诸如
    ```ini
    processor0.use = "FALSE"
    processor1.use = "FALSE"
    processor2.use = "FALSE"
    processor3.use = "TRUE"
    ```
    的方式绑定线程,如果这里的绑定与分配的线程数量不一致,以数量较小的那个为准
    wangyuyang3
        21
    wangyuyang3  
       2022-09-06 22:18:48 +08:00
    @cubecube @chackchackGO @iloveayu @ysc3839
    我刚刚做了几轮测试,我收回上面说的话哈哈哈。无论是虚拟化 windows 系统还是 linux ,总线程一致的情况下在 vmware 上设置各种处理器数和核心数的搭配组合,经过比较简单的测试发现性能差别微乎其微。这里奉上测试记录:

    宿主机 CPU:9-12900K win11 22000.918
    VMware 版本号:vmware 16 pro 16.2.3 build-19376536
    虚拟机测试镜像:ubuntu-22.04-live-server-amd64.iso ( ubuntu 官方镜像),安装时不选择 minimized 选项
    虚拟机设置:
    由于宿主机开启了 Hyper-v ,所以 vmware 虚拟机设置里“虚拟化引擎”三个勾全去掉。
    移除声卡 /打印机 /USB 控制器,禁用内存页面休整,为启用了 Hyper-V 的主机禁用侧通道缓解,BIOS 引导

    测试工具:使用 Lemonbench 标准模式 CPU Performance Test ( Standard Mode ,3-pass @ 30sec )

    [ubuntu 虚拟机+宿主机 vmware 进程强制只调用 8 大核 16 线程]
    2CPU 8core
    单核 4317
    多核 35842

    8CPU 2core
    单核 4312
    多核 35869


    [ubuntu 虚拟机+宿主机 vmware 进程不设置 CPU 相关性,调用 8 大核 8 小核 24 线程]
    1CPU 24core
    单核 4326
    多核 58438

    24CPU 1core
    单核 4345
    多核 58329

    8CPU 3core
    单核 4334
    多核 58985


    Windows 跑 CPU-Z
    [Windows 10 1CPU 16core 宿主机分别调用 8 大核 16 线程 /8 大核 8 小核 24 线程]
    单核:756.1 751.8
    多核:7583.8 8493.9

    [Windows 10 2CPU 8core 宿主机分别调用 8 大核 16 线程 /8 大核 8 小核 24 线程]
    单核 752.8 755.9
    多核 7577.2 8444.4


    附言:
    虽然看上去在大小核架构的宿主机 CPU 上,不屏蔽小核,性能测试结果似乎不会有影响,也没有出现“小核拉满,大核围观”的情况。但在实际跑应用的时候,或多或少调用会出问题。

    @ragnaroks 之前也是直接改虚拟机配置文件的,后来发现有时候不太稳定?比如有时生效,有时不生效。单纯用 windows 自带任务管理器,宿主机或者虚拟机重启后相关性设置就恢复默认值了。最后还是发现 prosess lasso 可以长期保持相关性设置的稳定。另外要吐槽的是,无论用什么方法设置 VMware 虚拟机的 CPU 相关性来屏蔽小核,虚拟机开机的时候极大概率会报错:未能开启“X:\^\^.vmx"。疯狂点开机可以跳过这个错误。
    ragnaroks
        22
    ragnaroks  
       2022-09-07 08:49:50 +08:00   ❤️ 1
    @wangyuyang3 配置文件设置的方式,要想完全对应,需要 TRUE 的线程数量与分配的数量完全一致,且对所有线程都要做出分配,如果有 128 个线程,那就要写 128 行 processor0.use = "FALSE"/"TRUE"
    wangyuyang3
        23
    wangyuyang3  
       2022-09-07 10:04:25 +08:00
    @ragnaroks 好嘞感谢!我再试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:07 · PVG 11:07 · LAX 19:07 · JFK 22:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.