PostgreSQLのメモリチューニングはじめの一歩


こんにちは。
開発メンバのKです。

今回Linux環境でPostgreSQLのメモリチューニングのための設定変更をする機会があったので、変更までの手順をはじめからまとめてみました。

PostgreSQLを使ってはいるけれど、意外とメモリ周りの設定は「なんだか難しそう、よくわからない」そんな印象のために、デフォルト値のままだったりすることもあるかもしれません。

実際にやってみると変更自体はそれほど難しくないので、これを機に一度見直してみましょう。

メモリチューニングって難しそうだけど…

はじめの一歩は、サーバーのスペックやメモリに合わせて適切な設定値に設定することです。

では手順を見ていきます。

ステップ1:サーバーのスペックを把握する
ステップ2:PGTuneで適正な設定値を知る
ステップ3:postgresql.conf設定ファイルを編集する
ステップ4:PostgreSQLに反映させる
ステップ5:パラメータが変更されたことを確認する

設定するための適正値を知る方法

簡単にサーバーのスペックを基に適正値を求めるには「PGTune」というツールがあります。

左側にサーバーのスペックや使用目的などを入力し、ボタンを押すと入力した値を基に、右側に各パラメータ値が表示されます。

https://pgtune.leopard.in.ua

ステップ1:サーバーのスペックを把握する

PGTuneに入力するためにサーバーのスペックを調べましょう。

・DB version ⇒postgresqlのバージョン確認コマンド「psql –version」
・OS Type  ⇒環境のOSを選択
・DB Type  ⇒使用用途に合わせて選択
・Total Memory (RAM)⇒確認コマンド「cat /proc/meminfo | grep MemTotal」
・Number of CPUs ⇒確認コマンド「lscpu | grep CPU」の結果のCPU(s)の部分
・Number of Connections ⇒postgresql.confの「max_connectionsの値」
・Data Storage ⇒確認コマンド「lsblk -d -o name,rota」の結果1:HDD、0:SSD

[参考] lsblk -d -o name,rota
https://www.sublimelms.com/blog/How-to-detect-your-server-has-SSD-or-HDD-hard-disk

ステップ2:PGTuneで適正な設定値を知る

ステップ1で確認したサーバースペック等をPGTuneに入力して、Generateボタンを押します。

今回の結果はこんな値でした。(環境は手順説明用に用意したEC2インスタンスを使用しています)

 

ステップ3:postgresql.conf設定ファイルを編集する

PGTuneの結果から各パラメータの意味を理解したうえで、変更するパラメータを決めます。そしてpostgresql.confの該当するパラメータの値を変更します。

今回は、以下の項目を変更します。

shared_buffers = 256MB
effective_cache_size = 768MB
maintenance_work_mem = 64MB
wal_buffers = 7864kB
work_mem = 1310kB
min_wal_size = 1GB
max_wal_size = 4GB

ステップ4:PostgreSQLに反映させる

今回は、変更の反映に再起動が必要になるパラメータshared_buffers、wal_buffersを含むのでPostgreSQLを再起動します。

systemctl restart postgresql

パラメータによっては再起動が不要なパラメータもあります。postgresql.confを開いてコメントを見てみましょう。「(change requires restart)」と記載のあるパラメータは再起動が必要ですが、それ以外は再起動せずにリロードで反映させることができます。

変更対象に再起動が必要なパラメータを含まない場合は、リロードでOK!

データベースに接続して SELECT pg_reload_conf();

ステップ5:パラメータが変更されたことを確認する

最後に変更が反映されたことを確認します。

データベースに接続して SHOW shared_buffers;

のように確認したいパラメータを指定して実行します。

変更されていることが確認できました。

これで設定変更までは完了です。

この先は調整になると思うので、手始めに「ある程度の適正値の目安」と「変更の方法」が分かれば、次に進めやすいのではないでしょうか。

※「SHOW ALL;」や「SHOW shared_buffers;SHOW effective_cache_size;SHOW maintenance_work_mem;SHOW wal_buffers;SHOW work_mem;SHOW min_wal_size;SHOW max_wal_size;」でまとめて確認もあり

まとめ

今回、サーバーのスペックを基に適切なPostgreSQL設定値に変更する流れまでを書いてみました。

デフォルト値のままでなかなか手を付けられていなかった方も、まずはPGTuneで適正値を確認して、現在の設定値と比較してみることで、PostgreSQLメモリチューニングのための一つのきっかけになればと思います。