核心和記憶體分開記
這台機器的處理器是 32 核心、64 執行緒。記憶體在下單時於 128GB 與 256GB 裡選定,規格是 DDR4-3200 ECC RDIMM。兩檔是兩款機型。裝好以後不能再加裝記憶體。執行緒可以在虛擬機器之間分時共用,記憶體頁不會因為超分而變多。下單前先做兩本帳:一本算執行緒,一本算固定記憶體。兩本帳都從宿主機自己留下的那一份減起,減完才是虛擬機器的預算。
磁碟是另一本帳。預設 2×1TB NVMe,無硬體 RAID,磁碟獨立直連。系統和虛擬機器磁碟怎麼拆開,寫在 Proxmox 在兩塊直連 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。