案件でふと気になった内容を、こちらでまとめます。
Kubernetes上にPostgreSQLをデプロイする際に悩みがちなのが、resources.requests と limits の設定。
アプリと違って、DBは適当に設定すると OOM Kill → 即障害 になりやすいので、最低限の考え方をまとめます。
まず実務的な結論。
requests ≒ limits にするのが基本
メモリは PostgreSQL設定から逆算
CPUは後からチューニングでもOK
resources:requests:memory: 12Gicpu: "2"limits:memory: 12Gicpu: "2"DBはGuaranteed QoSで動かすのが無難。
理由はシンプル。
PostgreSQLはメモリ前提の設計
メモリ不足 = 性能劣化じゃなくて死亡
OOM KillでWAL破損リスクあり
つまり「足りないと死ぬ」。
PostgreSQLのメモリは大きく3種類。
shared_buffers
background workers
常に使用される領域。
work_mem
maintenance_work_mem
ここが爆発ポイント。
max_connections に比例して増える。
autovacuum
OS page cache
WAL buffer
余裕分として見積もる。
ざっくり見積もるならこれでOK。
Total Memory ≒shared_buffers+ (work_mem × max_connections × 4)+ 30% 余裕×4 は並列クエリ係数(軽めなWeb想定)設定例:
計算:
合計:
→ requests.memory = 12Gi
CPUはメモリほどシビアじゃない。
ざっくり目安:
| ワークロード | vCPU |
|---|---|
| 小規模API | 1〜2 |
| 中規模Web | 2〜4 |
| 分析系 | 4〜8+ |
迷ったら 2vCPUスタート でOK。
基本は2択。
メリット:
OOM減る
QoS Guaranteed
デメリット:
ノード密度下がる
requests:memory: 8Gilimits: {}PostgreSQLはOOMに弱い。
WAL flush中に死亡
crash recovery長時間
PVC肥大化の原因にも
メモリlimitは慎重に。
Kubernetesはswap無効が多い。
つまり:
メモリ不足 = 即OOM
理論より現場はこっち。
VM版PostgresのRSSを見る
Prometheusのmemory usage確認
requests=4Giで開始
Prometheusで観測
徐々に上げる
良記事まとめ。
CloudNativePGのドキュメントは特に実務向け。