コアとメモリは別の帳面
このマシンのプロセッサは 32 コア、64 スレッドです。メモリは発注時に 128GB か 256GB を選び、規格は DDR4-3200 ECC RDIMM です。二択は二種類のマシンです。導入後にメモリモジュールは足せません。スレッドは仮想マシンのあいだで時間を分けて使えます。メモリページは過剰割り当てでは増えません。帳面は二つです。スレッドと、固定メモリです。どちらもホストが残す分を引いた残りが、仮想マシンの予算です。
ディスクは別の帳面です。標準は 2×1TB NVMe、ハードウェア RAID なし、各ディスクは直結です。システムと仮想マシンのディスクの分け方は 2 台の直結 NVMe で Proxmox のディスクを分ける にあります。分け方が正しくても、128GB は 256GB になりません。
帯域とアドレスもメモリの段を変えません。追加アドレスを標準の 1 個と一緒に数える手順は 追加 IPv4 と標準アドレスを一緒に数える です。この記録が決めるのはコアとメモリだけです。
ホストが残すスレッド
64 スレッドは 32 個の物理コアから来ます。1 コアに SMT スレッドが 2 本です。SMT の 1 本は、満速のコア 1 個と同じではありません。データベース、コンパイル、その中でさらに仮想マシンを動かすゲストは、物理コアで予算を取ります。ほとんどネットワーク待ちのサイトは、スレッドの共有で足ります。
ホストは画面、ネットワーク、ストレージのためにスレッドを残します。ZFS がなければ 4 スレッド、つまり 2 コアです。いずれかのプールが ZFS なら 8 スレッド、つまり 4 コアです。スクラブとチェックサムの余地です。Proxmox に「ホスト予約」というスイッチはありません。各仮想マシンの CPU affinity で、そのスレッドを避けます。ZFS がなければ 4-63 とし、0–3 を避けます。ZFS があれば 8-63 とし、0–7 を避けます。番号は 0 から 63 です。付け漏れた 1 台が予約スレッドを占有するので、全台に同じ指定をします。ホストのプロセスは全スレッドを使えます。
同時に埋まる 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 コアが残ります。サイト 10 台が各 2 vCPU なら合計 20 スレッドで、このデータベースと同居できます。データベースが 16 vCPU、ほかに各 8 vCPU で埋まるゲストが 4 台なら、コア換算は 48 で 30 を超えます。埋まる vCPU を先に減らします。256GB のコア数は 32 のままです。
導入後に lscpu で NUMA ノード数を見ます。この 7543P はシングルソケットでも、ノードが 1 より多くなることがあります。多いときは、データベースのメモリと vCPU を同じノードに置きます。ノードが 1 つなら、ノードをまたぐ配置は不要です。
ホストが残すメモリ
Proxmox の文書は、仮想マシンへメモリを割り当てるときホストに 1GB 以上の空きを残す、と書いています。これは下限です。このマシンは複数の仮想マシンを同時に動かし、ノードには画面、ログ、ページキャッシュもあります。予算ではノードにさらに 8GB を残し、どの仮想マシンにも割り当てません。
ZFS の ARC は別に数え、実際の上限を先に読みます。インストーラでシステムを ZFS に置くと、Proxmox VE 8.1 以降は ARC 上限をメモリの約 1 割、かつ 16GB 以下として /etc/modprobe.d/zfs.conf に書きます。128GB の 1 割は約 12.8GB で、上限未満です。256GB の 1 割は 16GB を超えるので、上限は 16GB です。この上限はホスト側に残り、仮想マシンへは分けません。VE 8 の初期メディアと、導入後に作ったプールには、この上限がないことがあります。
後から作ったプールは、ZFS 自身の初期値、およそ半分に落ちます。ZFS 2.3 以降、初期値はメモリの 62.5% まで上がります。128GB では、ゲストを作る前に約 64GB が先に使われます。上限を変えてから仮想マシンを作ります。
/proc/spl/kstat/zfs/arcstats の c_max を読みます。単位はバイトです。1024 の 3 乗で割ると GiB です。ファイルがなければ ZFS は読み込まれておらず、ARC は 0 です。上限を変えるときは zfs.conf に zfs_arc_max を書きます。値は GiB に 1024 の 3 乗を掛けた数です。128GB の約 1 割なら 12GiB、つまり 12884901888 です。256GB では ARC の上限を 16GiB、つまり 17179869184 にします。この二択では、その上限は ARC の初期下限(メモリの約 32 分の 1)より高いので、この 1 行で足ります。その後 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 に残せます。サイトが増えても、1 台が小さく、同時には埋まらなければ収まります。この表の制限はメモリの合計です。コアにはまだ余地があります。
埋まる 8 コアにホストの 2 コアを足しても、32 コアまでは距離があります。システムディスクが ZFS なら上限は約 107GB です。96GB の組は余り約 11GB で、128GB に残せます。104GB の組は余り約 3GB なので余裕がなく、256GB に変えます。
256GB にする分け方
次の表の上から三組は固定メモリが 120GB を超え、ZFS なしの 128GB には入りません。四組目は 112GB です。120GB は超えませんが、余りは 8GB だけなので余裕がなく、256GB にします。ZFS なしの 256GB の上限は 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 |
各 8GB のゲスト 20 台に 2 vCPU ずつ付けると、合計 40 スレッドです。残りの 60 スレッドに収まります。制限はメモリです。データベースが固定 128GB を求めると、128GB のマシンにはノードの 8GB を置く場所がありません。256GB の上限 248GB なら入り、余りは 120GB です。
64GB のデータベースに 48GB のネスト用ホストを足すと 112GB です。120GB に対する余りは 8GB なので、256GB にします。システムディスクがすでに ZFS なら上限は約 107GB で、112GB 自体が超えます。ネスト用ホストの 48GB は物理マシンへ一括で数えます。中の小さな仮想マシンだけを足したり、二度数えたりしません。
二択は同じ AMD EPYC 7543P、32 コア / 64 スレッド、2.8–3.7 GHz、L3 256MB です。メモリはどちらも DDR4-3200 ECC RDIMM です。128GB は月額 $462、256GB は月額 $595、差は $133 です。256GB で増えるのはメモリです。コア数は 32 のままです。設置場所は日本の東京です。システムは Proxmox VE 8 または 9 を選べ、OS の追加料金はありません。標準ディスクは 2×1TB NVMe、ハードウェア RAID なし、各ディスクは直結で、使える容量は二台の合計です。帯域は 250M、1G、2G で、月額の加算は $0、$255、$745、いずれも転送量の上限はなく、メモリの帳面は変わりません。IPv4 は 1 個が含まれ、追加は 1 個 $2、最大 255 個です。支払額は月額に月数を掛けた値です。月払い、四半期、半年、年払いに割引はありません。初期費用はありません。ノードは SSH で扱います。
ゲストの中でもう一段
ネストが要るのは、ゲスト自身が KVM か別の Proxmox を動かすときです。通常のサイトとデータベースには不要です。有効にすると、内側の仮想マシンは外側ゲストのメモリと 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 のパスはアンダースコアです。どちらも同じモジュールです。ファイルに別の行があれば追記し、ファイル全体は上書きしません。その後ノードを再起動します。
外側ゲストの CPU は host
ノードで qm set 101 --cpu host を実行します。101 は外側ゲストの番号に置き換えます。画面ではハードウェア、プロセッサ、タイプを host にします。変更のあと、ノードからそのゲストを停止してから起動し、QEMU が host で作り直されるようにします。ゲスト OS の中で再起動しても、CPU タイプは替わりません。
ゲストが起きたら、その中で svm の確認をもう一度実行します。出力があれば、内側はハードウェア支援つきで作れます。外側に 8 vCPU を付けると、内側が同時に使えるのもその 8 つで、物理コアは増えません。内側 3 台が各 4 vCPU なら合計 12 で、外側の 8 をすでに超えます。内側が先に過剰割り当てです。物理の 32 コアは増えません。
外側のメモリは一括で引く
外側に 48GB を付けたなら、内側の固定メモリと外側システムが残す分の合計は、その 48GB より小さくします。内側 3 台が各 8GB なら 24GB、外側システムが 8GB を残しても 48GB に収まります。内側にもう 1 台 32GB を足すと 24+32+8 で 64 になり、48 を超えます。先に外側を大きくします。外側を 48GB から 64GB にすると、その差分は物理マシンの上限から改めて引きます。
この層を前の表へ戻します。ZFS なしで上限 120GB のとき、64GB のデータベースとこの 48GB の外側を足すと 112GB、余り 8GB なので 256GB にします。外側の中の 24GB は、すでに 48GB に含まれています。ネストは試験と、1 台のゲストの中の小さな仮想マシンに向きます。内側を物理マシンと同じ密度で埋めません。外側に渡したメモリは、ノード上の他の仮想マシンへは分けられません。
発注前に帳面を閉じる
予算は、同時に起動している仮想マシンで数えます。週のどこかで一度動いただけの台は入れません。昼に停止しているコンパイル用は、昼の合計に入りません。夜にデータベースと一緒に動くなら、夜の組み合わせを別に数えます。両方とも上限に収まり、余りが 8GB より大きいときだけ、128GB で確定します。昼だけ数えて夜の組を外すと、導入後にメモリが足りなくなり、モジュールは足せません。
- システムディスクが ZFS かを確認します。そうなら ARC 上限を入れます。違うなら ARC は 0 です。後から作ったプールは、約 1 割かつ 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 です。アプリ 4 台が各 8GB、サイト 2 台が各 4GB です。メモリ合計は 104GB です。ZFS がなければ上限 120GB、余り 16GB で 8GB より大きいので 128GB のままです。データベースは 8 コア、ホストは 2 コア、アプリとサイトは長く埋まりません。同じ組でシステムディスクが ZFS なら上限は約 107GB、余り約 3GB なので 256GB です。データベース自体を固定 128GB にすると、その 1 台で 120GB を超えるので 256GB です。ZFS なしの 256GB の上限は 248GB です。128GB のデータベースに、元のアプリとサイト 40GB を足すと 168GB、余り 80GB で収まります。
コアの帳面は二択で同じです。メモリの帳面は違います。固定メモリの合計と余りが 128GB に合わなければ、発注は 256GB です。
メモリの段を決めてから仮想マシンを切る
$462 / 月額から