Aurora PostgreSQLはShared Buffers(共有バッファ)のみを使い、OSキャッシュは使っていない
調べたこと
AWS Aurora PostgreSQL の shared_buffers
の値は、メモリ全体の75%程度となぜ高いのかが気になったので調べてみました。
結論
Shared Buffers(共有バッファ)は、テーブルやインデックスのデータをメモリキャッシュしておくためのバッファです。
PostgreSQLは、OSのキャッシュをShared Buffersの延長線として考えているので、Shared Buffersにデータがなくても、OSのキャッシュ上にデータが残っていればディスクアクセスなしに参照できます。
しかし、Aurora PostgreSQLは、ファイルシステムキャッシュを利用しません。よって、Shared Buffers(共有バッファ)の値は大きくしておく必要があります。
出典
AWS 情報センター
Aurora DB インスタンスの場合、DB パラメータグループのデフォルト値は、インスタンスクラスに応じて 50% から 75% の間で設定されます。Aurora PostgreSQL はダブルバッファリングを排除し、ファイルシステムキャッシュを利用しないため、Aurora DB インスタンスのデフォルト値は高くなっています。つまり、Aurora PostgreSQL では shared_buffers を大きくして、パフォーマンスを改善できます。Aurora PostgreSQL を使用する場合は、shared_buffers DB パラメータのデフォルト値には、75% を設定することがベストプラクティスです。この値が小さいと、データページが使用可能なメモリが少なくなるため、Aurora ストレージサブシステムの I/O が増加したときに、パフォーマンスの低下が生じる可能性があります。AWS 情報センター
AWS Blog
With Aurora PostgreSQL, I/O is handled by the Aurora storage driver. There is no file system or secondary level of caching for tables or indexes. This means that shared_buffers should be larger than what the PostgreSQL community recommends. Smaller settings may result in poor performance. Typically, the value for shared_buffers in the default parameter group is set using the formula SUM({DBInstanceClassMemory/12038},-50003), which is about 75% of the available memory. The default value is a good starting point for most workloads.
(日本語訳:Aurora PostgreSQLでは、I/Oは Aurora ストレージドライバーによって処理されます。テーブルやインデックスのためのファイルシステムや二次レベルのキャッシングはありません。これは、shared_buffersがPostgreSQLコミュニティが推奨するよりも大きくなければならないことを意味します。小さすぎる設定は性能低下を招く可能性があります。通常、デフォルトのパラメータグループでのshared_buffersの値は、SUM({DBInstanceClassMemory/12038},-50003)という式を使用して設定されます。これは利用可能なメモリの約75%に相当します。デフォルト値は、ほとんどのワークロードにとって良い出発点となります。) AWS Database Blog
Discussion