内存不能加条时,虚拟机的核和内存怎么留?

32 核、64 线程,内存只有 128GB 与 256GB 两档,而且不能事后加条。先从总数里减掉宿主机要留下的核和内存,剩下的再分给会同时运行的虚拟机。加总超过 128GB 那一档的预算,就在下单前改选 256GB。

先留宿主机核和内存都从总数里先减这一份。
两档不能加条128GB 与 256GB 在下单时选定。
嵌套要算三层内层虚拟机吃的是外层客机的预算。

核和内存分开记

这台机器的处理器是 32 核、64 线程。内存在下单时于 128GB 与 256GB 里选定,规格是 DDR4-3200 ECC RDIMM。两档是两款机型。装好以后不能再加内存条。线程可以在虚拟机之间分时共用,内存页不会因为超分而变多。下单前先做两本账:一本算线程,一本算固定内存。两本账都从宿主机自己留下的那一份减起,减完才是虚拟机的预算。

磁盘是另一本账。默认 2×1TB NVMe,无硬件 RAID,盘独立直连。系统和虚拟机磁盘怎么拆开,写在 两块直连 NVMe 上怎么分盘。磁盘分对,也不会把 128GB 变成 256GB。

带宽和地址同样不改内存档。地址怎样和默认的那一个一起计数,见 额外 IPv4 和默认地址怎么一起算。这篇只把核和内存算清楚。

128GB 与 256GB 在下单时选定。装好以后不能加内存条。计划内的固定内存超过这一档的预算,就在付款前改选 256GB。

宿主机先留线程

64 个线程来自 32 个物理核,每个核两条 SMT 线程。一条 SMT 线程不是一颗满速的核。数据库、编译,以及里面还要再跑虚拟机的客机,按物理核占预算。大部分时间在等网络的站点,按线程共用即可。

宿主机要留下一批线程,给节点上的界面、网络和存储。没有 ZFS 时留 4 个线程,也就是 2 个核。任一磁盘池使用 ZFS 时留 8 个线程,也就是 4 个核,校验和清洗时仍有余量。Proxmox 没有一个名叫宿主机预留的开关。做法是让每台虚拟机的 CPU affinity 都避开这几个线程。没有 ZFS 时,虚拟机填 4-63,避开 0–3。有 ZFS 时填 8-63,避开 0–7。线程编号从 0 到 63。漏掉的那一台仍会占用预留线程,所以每台都要填。系统进程仍可以使用全部线程。

会同时吃满的 vCPU 个数,不要超过剩下的线程。没有 ZFS 时剩下 60 个线程,有 ZFS 时剩下 56 个。站点的 vCPU 可以加总超过这个数,因为它们不会一起跑满。只要有一台长期吃满,它的 vCPU 就要按核从 32 里面减。没有 ZFS 时,长期吃满的核最多 30 个。有 ZFS 时最多 28 个。两档内存用的是同一颗处理器。选 256GB 不会多出核。

账没有 ZFS有 ZFS
全部线程64(32 核)64(32 核)
宿主机留下4 个线程,亲和性避开 0–38 个线程,亲和性避开 0–7
其余线程6056
长期吃满的核最多 30最多 28

一台数据库给 8 个 vCPU,按 8 个核计。没有 ZFS 时宿主机已占 2 个核,还剩 22 个核可以给其他会吃满的客机。十台站点各 2 个 vCPU,合计 20,落在剩余线程里,可以和这台数据库放在一起。若数据库要 16 个 vCPU,另外四台各 8 个 vCPU 且都会吃满,按核相加已经是 48,超过 30。这时先把会吃满的 vCPU 减下来。256GB 的核数仍然是 32。

装完用 lscpu 看 NUMA 节点个数。这颗 7543P 是单路处理器,节点仍可能多于一个。多于一个时,数据库虚拟机的内存和 vCPU 放在同一个节点上。节点只有一个时,不必再为跨节点改配置。

宿主机先留内存

Proxmox 文档写明,给虚拟机分配内存时,至少为主机留出 1GB 可用。那是下限。这台机器要同时跑多台虚拟机,节点上还有界面、日志和页缓存。预算里另留 8GB 给节点,不分配给任何虚拟机。

ZFS 的 ARC 另外计算,而且先读实际上限。用安装介质把系统装在 ZFS 上时,Proxmox VE 8.1 及更新的安装器会把 ARC 上限写成大约内存的一成,并且不超过 16GB,记在 /etc/modprobe.d/zfs.conf。128GB 的一成约为 12.8GB,低于封顶。256GB 的一成超过 16GB,按 16GB 封顶。这份上限留在宿主机一侧,不能再分给虚拟机。VE 8 的早期介质,以及装完才新建的池,可能没有这份上限。

池是后来才建的时候,ARC 会落到 ZFS 自己的默认,大约一半。ZFS 2.3 起,默认可以到内存的 62.5%。128GB 的机器上,这会先拿走大约 64GB。先把上限改掉,再创建虚拟机。

检查时读 /proc/spl/kstat/zfs/arcstats 里的 c_max。单位是字节,除以 1024 的三次方得到 GiB。文件不存在,说明当前没有加载 ZFS,ARC 按 0。要改上限时,在 zfs.conf 里写 zfs_arc_max,数值用 GiB 乘以 1024 的三次方。128GB 且按大约一成收,可以写成 12GiB,即 12884901888。256GB 按封顶写成 16GiB,即 17179869184。这两档上,该上限高于 ARC 的默认下限,默认下限大约是内存的三十二分之一,只写这一项即可。然后执行 update-initramfs -u,再重启节点。重启之前,不要按改完的数字创建虚拟机。

虚拟机固定内存合计的硬上限是:物理内存减去 ARC 上限,再减去 8GB。

机型ARC节点另留虚拟机固定内存合计
128GB,没有 ZFS08GB≤ 120GB
128GB,安装时 ZFS约 12.8GB8GB≤ 107GB
256GB,没有 ZFS08GB≤ 248GB
256GB,安装时 ZFS16GB 封顶8GB≤ 232GB
硬上限减去计划内合计,余量小于或等于 8GB 时,视为贴边,改选 256GB。这 8GB 会被日志、备份和临时多开的客机吃掉。装完不能加条。

气球不能当成加内存条。最小内存低于最大内存时,Proxmox 才在宿主机使用率低于目标时把内存借出,目标默认是 80%,不够时再收回。数据库,以及里面还要跑虚拟机的那一台,最小内存与最大内存设成同一个数,避免缓存被收回。站点可以留下差额,份额保持默认的 1000。KSM 只会合并内容相同的页,不会把 128GB 合成 256GB。规划时不要把 KSM 算进预算。

这些切法放得进 128GB

下面按没有 ZFS、硬上限 120GB 来比。固定内存是最小内存等于最大内存的那一个数。站点的 vCPU 不按长期吃满计。

同时运行固定内存长期吃满的核相对 120GB
8 台站点,各 4GB、2 vCPU32GB不按吃满计余量 88GB
数据库 64GB、8 vCPU,加 4 台应用各 8GB96GB8余量 24GB
数据库 48GB、8 vCPU,加 6 台站点各 4GB72GB8余量 48GB
数据库 64GB、8 vCPU,加 4 台应用各 8GB、2 台站点各 4GB104GB8余量 16GB

这四组的固定内存都不超过 120GB,长期吃满的核也不超过 30。余量都大于 8GB,没有 ZFS 时可以留在 128GB。站点再多,只要单台内存小,而且不会一起吃满,限制因素是内存合计。这几组的核还有空余。

第三列里的 8 个核,加上宿主机的 2 个核,距离 32 核还远。所以这几组真正要核对的是内存。若系统盘是 ZFS,硬上限约为 107GB。96GB 那一组余量约 11GB,仍可以留在 128GB。104GB 那一组余量只剩约 3GB,按贴边处理,改选 256GB。

这些切法改选 256GB

下面前三组的固定内存超过 120GB,没有 ZFS 的 128GB 放不下。第四组合计 112GB,没有超过 120GB,余量只剩 8GB,按贴边改选 256GB。256GB 没有 ZFS 时硬上限是 248GB,四组都放得下,余量都大于 8GB。

同时运行固定内存128GB 无 ZFS256GB 无 ZFS
数据库 96GB,加 8 台应用各 8GB160GB超过 120GB248GB 内,余量 88GB
20 台客机,各 8GB160GB超过 120GB248GB 内,余量 88GB
数据库单独 128GB128GB超过 120GB248GB 内,余量 120GB
数据库 64GB,加嵌套宿主机 48GB112GB余量 8GB,贴边248GB 内,余量 136GB

20 台各 8GB 的客机,若各给 2 个 vCPU,合计 40 个线程,仍落在剩余的 60 个线程里。限制在内存。数据库单独要 128GB 固定内存时,连节点的 8GB 都没有地方放,128GB 这一档不够,256GB 的 248GB 上限可以放下,余量还有 120GB。

64GB 数据库再加一台 48GB 的嵌套宿主机,合计 112GB。相对 120GB 只剩 8GB,按贴边改选 256GB。系统盘若已是 ZFS,硬上限约为 107GB,112GB 本身就超过,同样改选 256GB。嵌套宿主机的 48GB 要整笔计入物理机,不要只加它内部那几台小虚拟机,也不要加两次。

两档用的是同一颗 AMD EPYC 7543P,32 核 / 64 线程,2.8–3.7 GHz,三级缓存 256MB。内存都是 DDR4-3200 ECC RDIMM。128GB 月租 $462,256GB 月租 $595,相差 $133。选 256GB 增加的是内存。核数仍是 32。机房在日本东京。系统可以选 Proxmox VE 8 或 9,这两项没有系统加价。默认磁盘是 2×1TB NVMe,无硬件 RAID,盘独立直连,可用容量按两块相加。带宽是 250M、1G 或 2G,月加价 $0、$255、$745,均不限流量,不改变内存账。默认含 1 个 IPv4,额外地址每个 $2,最多再加 255 个。应付等于月租乘以月数,月付、季付、半年付和年付都不打折,没有安装费。节点用 SSH 管理。

客机里再开一层

客机自己还要跑 KVM 或另一套 Proxmox 时,才需要嵌套。普通站点和数据库不需要。嵌套打开之后,内层虚拟机的内存和 vCPU 全部来自外层客机,外层客机的内存和 vCPU 又来自物理机。三层都要减,不能只减一层。

先看宿主机有没有露出 svm

在节点上执行 grep -m1 svm /proc/cpuinfo。有输出,说明处理器已经向系统露出 AMD 的虚拟化标志 svm。没有输出时,内层不会得到硬件辅助,这种切法先停下来,不要继续分内存。

再读嵌套参数

执行 cat /sys/module/kvm_amd/parameters/nested。读到 1,宿主机这一侧已经打开,不必再改模块。读到 0,先把全部虚拟机关掉。新建或追加 /etc/modprobe.d/kvm-amd.conf,写入 options kvm-amd nested=1。这一行的模块名用短横线。sysfs 路径里的模块名用下划线,两边是同一个模块。文件里已有别的行时只追加,不要整文件覆盖。然后重启节点。

虚拟机还在运行时卸载 kvm_amd,会得到模块正被使用。业务虚拟机开着的时候不要卸载这个模块。把配置写进文件后重启节点即可。

外层客机的处理器用 host

在节点上执行 qm set 101 --cpu host。101 换成这台外层客机的实际编号。界面上是同一件事:硬件、处理器、类型选 host。改完之后,在节点上把这台客机关机再开机,让 QEMU 按 host 重新创建。只在客机系统里重启,处理器类型不会换。

客机起来之后,在客机里再执行一次查看 svm 的命令。有输出,内层才可以创建带硬件辅助的虚拟机。外层给了 8 个 vCPU,内层所有虚拟机同时能用的也只有这 8 个,不会另外向物理机要核。三台内层各要 4 个 vCPU,合计 12,已经超过外层的 8,内层自己先超分,物理机的 32 核不会因此变多。

外层的内存整笔减掉

外层给了 48GB,内层虚拟机的固定内存加上外层系统自己要留的一份,必须小于这 48GB。三台内层各 8GB,合计 24GB,外层系统再留 8GB,48GB 够用。若内层还要一台 32GB,24+32+8 已经是 64,超过 48。先加大外层。加大外层会回头吃掉物理机的预算:48GB 变成 64GB 之后,要重新拿物理机的硬上限去减。

把这一层放回前面的表。物理机没有 ZFS、硬上限 120GB 时,一台 64GB 数据库加上这台 48GB 外层,合计 112GB,余量 8GB,按贴边改选 256GB。外层内部那 24GB 已经含在 48GB 里,不要再加到 112GB 上面。嵌套可以用来做试验,以及在一台客机里放若干小虚拟机。不要按物理机的密度去填满内层。外层已经占掉的内存,不能再分给物理机上的其他虚拟机。

下单前把账对完

预算按会一起开着的虚拟机计算,不是按一周里曾经开过的虚拟机计算。白天关掉的编译机,不计入白天那一组。晚上要和数据库一起开,晚上的组合另记一笔。两组都要满足硬上限,而且余量都要大于 8GB,才能把 128GB 定下来。只算白天、不算晚上那一组,装完会在内存上不够,而且不能加条。

  1. 确认系统盘是否 ZFS。是,就把 ARC 上限算进去。否,ARC 按 0。后来才建的池,先把 ARC 收到约一成、且不超过 16GB,再往下算。
  2. 节点另留 8GB。没有 ZFS 时,虚拟机亲和性避开 0–3。有 ZFS 时避开 0–7。
  3. 把会同时运行的虚拟机固定内存相加。有嵌套时,外层内存整笔计入,内层不要再加一次。
  4. 合计不超过硬上限,且硬上限减合计大于 8GB,才留在 128GB。否则选 256GB。
  5. 把长期吃满的 vCPU 按核相加。没有 ZFS 不超过 30,有 ZFS 不超过 28。超过时两档都解决不了,核数相同。
  6. 系统选 Proxmox VE 8 或 9。磁盘按分盘那篇,把系统与虚拟机磁盘分开。节点用 SSH 进入之后,再按上面的命令核对 svm、嵌套参数和 ARC。

走一遍白天那组数字。数据库固定 64GB、8 个 vCPU,最小内存也是 64GB。四台应用各 8GB,两台站点各 4GB。内存合计 104GB。没有 ZFS 时硬上限 120GB,余量 16GB,大于 8GB,留在 128GB。数据库按 8 个核,宿主机 2 个核,应用和站点不长期吃满,核也放得下。同一组若系统盘是 ZFS,硬上限约为 107GB,余量约 3GB,改选 256GB。数据库若改成固定 128GB,单这一台就超过 120GB,直接选 256GB。256GB 没有 ZFS 时硬上限 248GB,128GB 的数据库加上原来 40GB 的应用和站点,合计 168GB,余量 80GB,放得下。

核的账两档一样,内存的账两档不一样。固定内存的加总和余量对不上 128GB,就在下单时改选 256GB。

先选定内存档,再切虚拟机

$462 / 月起