核和内存分开记
这台机器的处理器是 32 核、64 线程。内存在下单时于 128GB 与 256GB 里选定,规格是 DDR4-3200 ECC RDIMM。两档是两款机型。装好以后不能再加内存条。线程可以在虚拟机之间分时共用,内存页不会因为超分而变多。下单前先做两本账:一本算线程,一本算固定内存。两本账都从宿主机自己留下的那一份减起,减完才是虚拟机的预算。
磁盘是另一本账。默认 2×1TB NVMe,无硬件 RAID,盘独立直连。系统和虚拟机磁盘怎么拆开,写在 两块直连 NVMe 上怎么分盘。磁盘分对,也不会把 128GB 变成 256GB。
带宽和地址同样不改内存档。地址怎样和默认的那一个一起计数,见 额外 IPv4 和默认地址怎么一起算。这篇只把核和内存算清楚。
宿主机先留线程
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–3 | 8 个线程,亲和性避开 0–7 |
| 其余线程 | 60 | 56 |
| 长期吃满的核 | 最多 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,没有 ZFS | 0 | 8GB | ≤ 120GB |
| 128GB,安装时 ZFS | 约 12.8GB | 8GB | ≤ 107GB |
| 256GB,没有 ZFS | 0 | 8GB | ≤ 248GB |
| 256GB,安装时 ZFS | 16GB 封顶 | 8GB | ≤ 232GB |
气球不能当成加内存条。最小内存低于最大内存时,Proxmox 才在宿主机使用率低于目标时把内存借出,目标默认是 80%,不够时再收回。数据库,以及里面还要跑虚拟机的那一台,最小内存与最大内存设成同一个数,避免缓存被收回。站点可以留下差额,份额保持默认的 1000。KSM 只会合并内容相同的页,不会把 128GB 合成 256GB。规划时不要把 KSM 算进预算。
这些切法放得进 128GB
下面按没有 ZFS、硬上限 120GB 来比。固定内存是最小内存等于最大内存的那一个数。站点的 vCPU 不按长期吃满计。
| 同时运行 | 固定内存 | 长期吃满的核 | 相对 120GB |
|---|---|---|---|
| 8 台站点,各 4GB、2 vCPU | 32GB | 不按吃满计 | 余量 88GB |
| 数据库 64GB、8 vCPU,加 4 台应用各 8GB | 96GB | 8 | 余量 24GB |
| 数据库 48GB、8 vCPU,加 6 台站点各 4GB | 72GB | 8 | 余量 48GB |
| 数据库 64GB、8 vCPU,加 4 台应用各 8GB、2 台站点各 4GB | 104GB | 8 | 余量 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 无 ZFS | 256GB 无 ZFS |
|---|---|---|---|
| 数据库 96GB,加 8 台应用各 8GB | 160GB | 超过 120GB | 248GB 内,余量 88GB |
| 20 台客机,各 8GB | 160GB | 超过 120GB | 248GB 内,余量 88GB |
| 数据库单独 128GB | 128GB | 超过 120GB | 248GB 内,余量 120GB |
| 数据库 64GB,加嵌套宿主机 48GB | 112GB | 余量 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 路径里的模块名用下划线,两边是同一个模块。文件里已有别的行时只追加,不要整文件覆盖。然后重启节点。
外层客机的处理器用 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 定下来。只算白天、不算晚上那一组,装完会在内存上不够,而且不能加条。
- 确认系统盘是否 ZFS。是,就把 ARC 上限算进去。否,ARC 按 0。后来才建的池,先把 ARC 收到约一成、且不超过 16GB,再往下算。
- 节点另留 8GB。没有 ZFS 时,虚拟机亲和性避开 0–3。有 ZFS 时避开 0–7。
- 把会同时运行的虚拟机固定内存相加。有嵌套时,外层内存整笔计入,内层不要再加一次。
- 合计不超过硬上限,且硬上限减合计大于 8GB,才留在 128GB。否则选 256GB。
- 把长期吃满的 vCPU 按核相加。没有 ZFS 不超过 30,有 ZFS 不超过 28。超过时两档都解决不了,核数相同。
- 系统选 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。