一般社団法人 全国個人事業主支援協会

COLUMN コラム

案件でふと気になった内容を、こちらでまとめます。

Kubernetes上にPostgreSQLをデプロイする際に悩みがちなのが、
resources.requestslimits の設定。

アプリと違って、DBは適当に設定すると OOM Kill → 即障害 になりやすいので、最低限の考え方をまとめます。


結論

まず実務的な結論。

  • requests ≒ limits にするのが基本

  • メモリは PostgreSQL設定から逆算

  • CPUは後からチューニングでもOK

resources:
requests:
memory: 12Gi
cpu: "2"
limits:
memory: 12Gi
cpu: "2"

DBはGuaranteed QoSで動かすのが無難。


なぜDBは特別扱いなのか?

理由はシンプル。

  • 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想定)

計算例

設定例:

shared_buffers = 2GB
work_mem = 16MB
max_connections = 100

計算:

16MB × 100 × 4 = 6.4GB

合計:

2GB + 6.4GB + 余裕 ≒ 10〜12GB

→ requests.memory = 12Gi


CPUの考え方

CPUはメモリほどシビアじゃない。

ざっくり目安:

ワークロード vCPU
小規模API 1〜2
中規模Web 2〜4
分析系 4〜8+

迷ったら 2vCPUスタート でOK。


limitsはどうする?

基本は2択。

パターン① requests = limits(推奨)

メリット:

  • OOM減る

  • QoS Guaranteed

デメリット:

  • ノード密度下がる


パターン② limitsなし

requests:
memory: 8Gi
limits: {}
専用ノードならアリ。

Kubernetes特有の注意点

OOM Killは想像以上に危険

PostgreSQLはOOMに弱い。

  • WAL flush中に死亡

  • crash recovery長時間

  • PVC肥大化の原因にも

メモリlimitは慎重に。


swapは基本無い

Kubernetesはswap無効が多い。

つまり:

メモリ不足 = 即OOM


実務でよくやる決め方

理論より現場はこっち。

方法① 既存環境から逆算

  • VM版PostgresのRSSを見る

  • Prometheusのmemory usage確認


方法② 小さく始めて観測

  • requests=4Giで開始

  • Prometheusで観測

  • 徐々に上げる


参考リンク

良記事まとめ。

CloudNativePGのドキュメントは特に実務向け。

The following two tabs change content below.

Kenneth Ozeki

インフラ周りを担当するITエンジニアです。 経験はオンプレ5年、クラウド7年ほど python, go などで簡単な運用ツールも作成してます

この記事をシェアする

  • Twitterでシェア
  • Facebookでシェア
  • LINEでシェア