10 ポイント 投稿者 xguru 2021-11-15 | 1件のコメント | WhatsAppで共有
  • Heapは分析用のマルチペタバイト級Postgresを運用中

  • 急速な成長に伴いノード使用率が80%を超え、収集パイプラインで性能問題が発生

  • 問題の原因は、SSDは使用率が100%に近づくと性能が低下する傾向があること

  • CoW(Copy-on-Write)であるZFSを使っているため、問題が悪化

→ ブロックが更新されるたびに新しいコピーを作成

  • もちろん、CoWにはさまざまな利点がある

→ ファイルシステムレベルの圧縮が他のファイルシステムより容易で、4〜5倍圧縮して容量を節約

→ より高い耐久性があるため、Postgresのfull_page_writesを無効化でき、その結果として性能も向上し全体のI/Oも減少

→ 一貫性を保証するポイントインタイムスナップショット - ページは実際には変更不可能なため、スナップショット中でも古いページを維持

  • しかしZFSのようなCoWファイルシステムは、容量が埋まるにつれて性能が低下する

→ ページを更新するたびにブロックアロケータが空きブロックを探す必要があるため、使用率が高くなると性能低下が深刻になる

→ 以前にアンリンクされたブロックを削除し、既存のブロック群と混在させなければならない

→ より高い圧縮率を得るためにブロックサイズを64kbと大きく設定していたため、さらに悪化していた

→ こうした理由から、ZFSの使用率は80%を超えないようにするのが望ましい

  • ZFS 2.xへアップグレードし、lz4圧縮からZstandard圧縮へ変更することを試行

lz4は非常に高速で、約4.4倍の圧縮率を示す

→ Zstandardは約5.5倍の圧縮率を示し、20%改善

→ ただし多くのベンチマークでは、Zstandardはlz4より速度が遅いとされている

→ そこで実環境で厳密なテストを行うことにした

→ テスト結果ではクエリ性能は変わらず、ストレージ使用量は約20%減少し、書き込みクエリ時間は半減

  • HeapのDBクラスターは5つのノードに分かれており、それぞれ別のASGに属している

→ ノードの入れ替えは、ASGから切り離すだけでよく、ASGが新しいノードを作成し、最終バックアップからリストアしてウォームスタンバイモードに入る

→ 新しい設定のAMIを作成し、各ノードを1台ずつ進めた

→ 全体の使用量は約21%減少し、書き込み時間は50%減少、クエリ性能には大きな違いはなかった

1件のコメント

 
xguru 2021-11-15

本文では CPU 使用率について触れられていませんが、HN で原著者のコメントを見ると、約 40% から約 50% に増加したとのことです。(Zstd のほうが CPU をより使うという話)