2025/04/17 22:37 Memory Size Matters to PostgreSQL

やっほー、ロボ子!今日のニュースはPostgreSQLのshared_bufferについてじゃ。

博士、こんにちは。shared_bufferですか。PostgreSQLのパフォーマンスに大きく影響する部分ですよね。

そうそう!shared_bufferは、PostgreSQLがサーバーのメモリに割り当てる領域で、データ領域とバックエンド間のデータフローを管理するのじゃ。

記事によると、データベースの物理ページは、データの読み書きに関わらず、共有バッファに格納されるんですね。

その通り!そして、PostgreSQL 8.1以降はクロックスイープアルゴリズムが使われているぞ。

クロックスイープアルゴリズムは、バッファの置換戦略を管理するものですね。ステップがたくさんありますね…

難しく見えるけど、要は使用頻度の低いバッファを追い出す仕組みじゃ。フリーリストが空だと、nextVictimBufferが頑張ってスキャンするのじゃ。

各バッファは、バックエンドによってピン留めされるたびに使用カウンタが増加するんですね。使用カウンタがゼロでないと、置換対象にならないと。

さすがロボ子、理解が早い!リングバッファ戦略ってのもあるぞ。これは、大量のVACUUMとか大規模なシーケンシャルスキャンの時に、共有バッファ全体への影響を避けるために使うのじゃ。

リングバッファ戦略ですか。VACUUMのリングサイズはvacuum_buffer_usage_limit GUCで制御できるんですね。

そう!バルク書き込みだと、リングサイズは16MBだけど、shared_buffersサイズの1/8を超えないようにするのじゃ。

shared_bufferのサイズ設定も重要ですよね。システムのRAMの25%を推奨とのことですが。

そうじゃ!4GB~100GBのシステムなら、1GB~25GBくらいが目安じゃな。40%まで上げるのは推奨されてないぞ。

データ領域がshared_bufferより小さい場合は、すべてのバッファがキャッシュされるんですね。それは理想的ですね。

じゃろ?でも、データ領域がshared_bufferに収まらないと、クロックスイープがフル稼働になるのじゃ。

64GBをshared_bufferの上限とすることが妥当、と記事にありますね。

デフォルト値は128MBと小さいから、initdb後に変更するのが超重要!

確かにそうですね。デフォルトのままでは、パフォーマンスが出ない可能性が高いですね。

というわけで、shared_bufferの設定は、PostgreSQLを使う上で避けては通れない道なのじゃ!

はい、博士。勉強になりました!

ところでロボ子、shared_bufferの設定を間違えるとどうなるか知ってるか?

えっと…システムが共有バッファを共有できなくなります…?

ぶっぶー!正解は…「共有」だけに「笑う」バッファになるのじゃ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
