先に判定表
読み方の前に、ピークで何が見えたらクラウドに残すか、専用機の月額を見るかを置きます。サンプルは平日ピーク、1秒または10秒間隔、少なくとも5営業日です。夜間バックアップは別ファイルにします。
| ピークで見えたもの | クラウドに残す | 専用機の月額を見る |
|---|---|---|
| steal が数秒跳ねるだけ。p95 は動かない | サイズを維持 | この行は該当しない |
| steal が約10%以上を数分維持し、p95 も同方向。vCPU を足しても残る | 増核は試した | 隣のテナントが CPU を持っている |
| user と sys が埋まり、steal はほぼ 0 | クラウド側の CPU を上げる | まだ移さない |
| コンテナのスロットルがピークで増え、割当は上限 | steal と同じ判断 | 上限でもスロットルが残る |
| 空きメモリは少ない。スワップなし。遅延は安定 | キャッシュとして残す | この行は該当しない |
| ピークでスワップまたは OOM。バッファプールが VM 上限を超える | クラウドに大きいメモリがない | ワーキングセットで 128GB か 256GB |
| ディスクが忙しいのはバックアップの時間だけ | バックアップをずらす | この行は該当しない |
| データディスクの待ち行列がしばしば 1 超。書き込み待ちが数十ミリ秒。コミットが遅い。IOPS は上限 | ディスク種別は変えた | 待ちは共有ストレージ |
一つだけなら、クラウドのサイズを変えて翌週同じ窓で測り直します。二つが平日ピークで複数日そろい、p95 も同じ方向なら、月額を今の請求と並べます。引っ越しが消すのは隣のテナントです。遅い SQL、足りない索引、ロック待ち、拠点までの距離はそのままです。
名前は請求書、列は監視
クラウドサーバーの多くは KVM 系の仮想マシンです。ホストに他のテナントがいます。ゲストからは steal が見えます。vCPU は実行可能だったのに、その時間は他人に渡っています。ディスクはネットワークボリュームであることが多く、IOPS は規格かクレジットです。メモリには上限があり、balloon で空いているページをホストが回収することがあります。
VPS は先に仮想マシンかコンテナかを分けます。仮想マシン型はクラウドと同じ列で、上限が小さいことが多いです。コンテナに steal の列はありません。CPU は cgroup のスロットル回数、メモリ上限はメモリコントローラに出ます。スロットルを「故障」と読むと外れます。「割当の上限」と読むと、steal と同じ判断になります。VPS は、一台のホストから切り出した区画のままです。専用サーバーはスケジューラを一顧客に渡します。
ベアメタルはこのノートでは専用サーバーと同じです。ホスト OS の steal は 0 付近です。待ち行列に他社がいないためです。ディスクはこの筐体の NVMe、メモリはこの筐体の物理モジュールで、容量は注文時に決まります。
ノイジーネイバーは steal に出る
steal は「走りたいのに、ホストが CPU を持っている」時間です。vmstat の st、top の %st がパーセントです。Prometheus では node_cpu_seconds_total の steal モードを rate し、コア平均にします。
数秒から十数秒の steal は、隣の短いバーストです。クラウドに残して問題ありません。 サイズもトラフィックも変えていないのに、ピークで steal が約 10% 以上へ何度も上がり、数分とどまり、API の p95 も一緒に上がる。これが CPU を長く持っていかれた状態です。詰まったホストで vCPU を足しても、列が長くなるだけです。
別のピークは分けます。user と sys がほぼ埋まり、steal がほぼ 0 なら、コアは自分で使い切っています。先にクラウドの CPU を上げます。上げたあとも営業時間に steal が戻るなら、ホスト側が制約です。 10% は読みの線であり、警報の規定ではありません。遅延予算が厳しければ線を下げ、待てるバッチなら上げます。複数の営業日と、p95 が同じ方向に動くこと。この二つがセットです。
コンテナ VPS に st はありません。CPU コントローラの cpu.stat で nr_throttled と throttled_usec を見ます。ピークでスロットル時間が増え続けるなら、割当が尽きました。プラン上限まで上げても残るなら、steal と同じ結論です。
専用機のホスト OS では steal は 0 付近に落ちます。その上で自分の仮想マシンを動かすと、ゲストに steal は出ます。32コアの分け方であって、隣の顧客ではありません。
ワーキングセットが上限を超えたとき
ワーキングセットは、その時間に繰り返し触られ、メモリに残す必要のあるページです。Linux は空いたメモリをキャッシュに使います。MemAvailable が低くても遅延が安定しているなら、多くはキャッシュです。「使用率 90%」だけで専用機に移ると、キャッシュ用のメモリを買うことになります。
営業時間に次が揃ったら書きます。vmstat の si と so が 0 のままにならない。メジャーフォルトが上がり、データベースの遅延も上がる。カーネルログに OOM がある。欲しいバッファプールが、この VM のメモリ上限より大きい。クラウドのサイズ表に、使える次の段がない。
balloon は、プロセスが埋まって見えなくてもゲストを圧迫します。ホストがページを戻すためです。圧迫の出どころがバルーンかワーキングセットかを先に分けます。
ワーキングセットがおおよそ 32GB で、スワップも OOM もなければ、クラウドのメモリを一段上げます。 すでにそのクラウドの最大メモリに届いているときが、専用機の二段です。どちらも DDR4-3200 ECC RDIMM で、128GB または 256GB。注文後にモジュールは足せません。 ピークのワーキングセットに、OS とページキャッシュの余裕を足して選びます。128GB に入らないなら 256GB で、月額は $592 です。どちらにも入らない負荷は、この機材でも収まりません。
空きが少なく遅延が安定しているうちはキャッシュです。営業時間のスワップ、OOM、上限を超えたバッファプールが、メモリの項目です。
クレジット切れのディスク待ち
データベースが遅いときは、NIC より先にデータディスクの待ちを見ます。iostat -xz 1 の aqu-sz が平均待ち行列、w_await が書き込み待ちです。OLTP が見るのはコミット時の fsync です。バックアップのシーケンシャル帯域は、昼のコミットを説明しません。
ピークでデータディスクの aqu-sz がしばしば 1 を超え、w_await が数十ミリ秒になり、スローログのコミットも伸びる。待ち行列がデータベースを止めています。MB/s はそのまま低いことがあります。
ネットワークボリュームには IOPS クレジットが乗ります。クレジットが尽きると待ちが急に伸び、数時間で戻ります。毎日同じ時間帯だけ遅く、プロセスを再起動しても変わらない形です。
IOPS をそのクラウドの最上段まで買っても営業日に繰り返すなら、制限は共有ストレージ側です。
夜のバックアップでディスクが埋まり、昼の w_await が平常なら、バックアップの時間をずらします。待ちが低く、遅いクエリがロックやフルスキャンなら SQL を直します。
NVMe では %util が 100% 近くても、それだけでは飽和とは見ません。待ち行列と書き込み待ちを、移したあとも使います。
今のインスタンスで数値を取る
専用機を注文する前に、今のクラウド VM か VPS で終わります。コマンドは採取だけです。
-
1
平日ピークを5日
vmstat 1でus、sy、st、si、soを残します。同じ窓の p95 を出します。バックアップ時間は分けて保存します。 -
2
キャッシュとワーキングセット
MemAvailableを、バッファプール設定とピークの実使用と並べます。OOM があればカーネルログを残します。コンテナはメモリ上限も読みます。 -
3
データディスクだけ
iostat -xz 1でデータディスクのaqu-szとw_awaitを、スローログのコミットと一緒に残します。 -
4
三行にまとめる
一行につき一つの項目です。有無、何日、p95 が同方向か。「有」が二行なら構成ページで月額を見ます。一行ならクラウドのサイズを変え、翌週測り直します。
vmstat 1
iostat -xz 1
us はユーザー、sy はシステム、id はアイドル、wa は I/O 待ち、st は steal です。si と so はスワップインとアウトです。
コンテナは nr_throttled の増分を st の横に置きます。その列がなければ CPU の結論は出しません。
遅延の主因が距離なら、steal が消えても往復は残ります。サーバーの設置は日本の東京です。日本と近隣への経路と、遠い地域への経路は別の問題です。ロック、索引不足、リージョンをまたぐ呼び出しは、この三項目の外です。
専用サーバーに移したあと
二つが成立したあとで見るのは、機材がその二つを受けられるかです。 CPU は単一ソケットの AMD EPYC 7543P、32コア / 64スレッド、2.8–3.7 GHz。この CPU を使うのは一顧客です。ホスト OS の steal は 0 付近になります。自分で切った仮想マシンの steal は、32コアの分配です。
メモリは二段です。128GB が月額 $465、256GB が月額 $592。どちらも DDR4-3200 ECC RDIMM です。ピークのワーキングセットで選びます。128GB に収まるなら 128GB です。
ディスクの標準は 2 × 1TB NVMe、ハードウェア RAID なし、ディスクは独立して直結 です。使える容量は 2TB として読みます。 待ちがネットワークボリューム由来なら、ローカル NVMe に替わったあと書き込み待ちは先に下がることが多いです。下がらなければ SQL か、1台では足りないかを見ます。 2TB を 0〜2 台追加できます。1台の月額は $83 で、これも直結です。元のアレイへは自動で入りません。ソフト RAID にする場合、使える容量はおよそ 1TB に戻ります。バックアップは筐体の外に置きます。
帯域の初期値は 250 Mbps、転送量無制限です。ディスク待ちはストレージの待ちなので、fsync のために 1G(月額 +$251)や 2G(月額 +$749)へ上げる判断にはしません。250M のポート自体が埋まったときに上げます。 IPv4 は 1 個が付きます。追加は 1 個あたり月額 $2、一台の合計は最大 256 個です。サブネットでは売りません。 システムは Ubuntu 24.04 を選べます。Windows は Standard が月額 +$21、Datacenter が月額 +$27 です。Linux は SSH、Windows は RDP です。
月額は、機種の価格に、追加ディスク台数 × 83、帯域の加算、追加 IP 数 × 2、OS の加算を足したものです。支払額は月額 × 月数です。月額、四半期、半年、年額は、この掛け算です。初期費用はありません。設置は日本の東京です。 ディスク待ちだけが成立し、CPU とメモリが静かなら、先にクラウドのディスクを最上段まで上げ、月額 $465 からの専用機と並べます。ワーキングセットも待ちも軽い負荷は、クラウドに残す方が収まることが多いです。二つ揃ったら、構成ページで 128GB か 256GB を選びます。