記憶體不能加裝時,虛擬機器的核心和記憶體怎麼留?

32 核心、64 執行緒,記憶體只有 128GB 與 256GB 兩檔,而且不能事後加裝。先從總數裡減掉宿主機要留下的核心和記憶體,剩下的再分給會同時運行的虛擬機器。加總超過 128GB 那一檔的預算,就在下單前改選 256GB。

先留宿主機核心和記憶體都從總數裡先減這一份。
兩檔不能加裝128GB 與 256GB 在下單時選定。
巢狀要算三層內層虛擬機器吃的是外層客體的預算。

核心和記憶體分開記

這台機器的處理器是 32 核心、64 執行緒。記憶體在下單時於 128GB 與 256GB 裡選定,規格是 DDR4-3200 ECC RDIMM。兩檔是兩款機型。裝好以後不能再加裝記憶體。執行緒可以在虛擬機器之間分時共用,記憶體頁不會因為超分而變多。下單前先做兩本帳:一本算執行緒,一本算固定記憶體。兩本帳都從宿主機自己留下的那一份減起,減完才是虛擬機器的預算。

磁碟是另一本帳。預設 2×1TB NVMe,無硬體 RAID,磁碟獨立直連。系統和虛擬機器磁碟怎麼拆開,寫在 Proxmox 在兩塊直連 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 / 月起