パフォーマンスチューニング時アプリケーションエンジニアも理解しておくと役に立つ部分に絞って、PostgreSQLの内部構造について図を多めに使ってまとめました。PostgreSQLを普段を使ってて内部構造に興味がある方、リリース間際に性能問題が発覚してパフォーマンスチューニングすることになった方、データベースが好きな方に参考にして頂けると幸いです。今までの経験からして重要そうなところだけに絞ってまとめてみました。PostgreSQLのディスク〜メモリ〜プロセスとパフォーマンスチューニングのポイントまずはパフォーマンスチューニング時にしていると役に立つ部分に絞ってPostgreSQLの内部構造(ディスク、メモリ、プロセス)についてみていきます。この辺りが抑えておきたい部分です。PostgreSQLのディスク〜プロセス〜メモリここからプロセス動作について解説しつつ、よくあるパフォーマンスチューニングの例もセットで解説していきます。WALライタプロセスからみていきます。WALライタプロセスの動作イメージとメモWALライタはメモリ上のWALバッファをディスク上のWALファイルに書き出しにいきます。後で解説するチェックポイントとWALファイルを使ってクラッシュ直前の状態に戻すことができます。(メモリにあるだけだとクラッシュ時に復元できない)WALバッファにはテーブルにレコードが登録・更新、テーブル自体が更新されたなどの情報を記録します。実はレコードが登録・更新されると共有バッファにも同じように記録しますが、システムがクラッシュした時にはWALを利用して復旧するために、WALバッファ(→WALファイル)→共有バッファ→データファイルのようにまずはWALが記録されます。短時間に多くの更新クエリが発行されたりすると、すぐにWALバッファがいっぱいになってしまい、ディスク書き込みに頻繁に行くことになります。ディスクI/Oはメモリ上での読み書きと違って速度が遅いため、PostgreSQLの性能が思うように出なくなることがあります。そのような場合はwal_bufferのサイズを調整してやることでディスクI/Oを減らしてパフォーマンスチューニングをしたりします。(実はWALバッファが短時間でいっぱいになると、この後解説するチェックポイントが頻繁に発生するのでそのチューニングも必要です)次にチェックポインタをみていきます。チェックポインタの動作イメージとメモチェックポインタは設定に従って一定時間が経過するとチェックポイントを発生させます。チェックポイントは、現在実行中のトランザクションも含めてディスクに記録します。整合性の取れたクラッシュ直前のコミット断面を復元できます。本来の性能が出ないケースがあります。WALバッファが頻繁にいっぱいになっている可能性が高いので、min_wal_sizeとmax_wal_sizeの設定を行います。(WALバッファは使い回すのでmin_wal_sizeはmax_wal_sizeに揃えるのが推奨)次はバキュームワーカーについてみていきます。更新前や削除前のデータを無効扱いにする特徴があります。(後でイメージ図を入れます・・・)そのため更新前や削除前の無効になったデータを削除(厳密に言うとその領域を再利用可能にする)するのがバキュームワーカーの役目です。図の通り空き領域を探して再利用可能な領域があれば空き領域マップを更新しています。無駄なディスクI/Oを減らすために可視性マップを利用しています)次はバックエンドプロセスについてみていきます。接続単位でメモリも確保します。作業メモリ上で計算を行います。同時接続クライアント数も考慮しつつ設定する必要があります。一時ファイルに書き出してディスクI/Oが頻発する。みたいなことにならないように注意しましょう!!最後にライタープロセスをみていきます。ライタープロセスの動作イメージとメモライタープロセスは共有バッファのメモリ上のデータを定期的にデータファイルに書き出します。共有バッファ上のキャッシュを更新します。(ディスクの読み書きよりもメモリの読み書きのほうが高速に行えるため)共有バッファ上で更新した内容を定期的にディスクに書き出すのがライタープロセスの役割です。共有バッファのサイズは128MBなので本番運用する際は恐らく設定変更をする必要があります。Page機能を有効にすることで対応します。Pageを有効にすることで、1テーブルページでマッピングできるメモリサイズを増やすことができ、テーブルページサイズとCPU負荷を減らすことができます。安定感が違うと思います。僕自身DBAもいなくてリリース直前で誰もデータベースの内部構造やパフォーマンスチューニングしたことないから全部一から見たりさせられて辛い経験をしてきましたが。この記事がそういう状況に陥らないお役に立てたら幸いです。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。