PostgreSQL的内存设计

首先

关于进行PostgreSQL设计时对于内存的考虑,我们总结如下。
在PostgreSQL中使用的内存可以大致分为两种类型,一种是在整个PostgreSQL服务器进程中共享的共享内存,另一种是在后端进程中分配的进程内存。

在使用PostgreSQL时,所使用的内存包括共享内存和进程内存。

本篇文章着重介绍了共享内存缓冲区(shared_buffers)和进程内存工作内存(work_mem)等重要的内容。

共享缓冲区(shared_buffers)

共享缓冲区用于以页面为单位缓存表和索引的数据。在数据访问时,将数据库文件逐页地展开到内存中,并提高了重复访问数据时的处理性能。

然而,并不是说共享缓冲区越大性能就越好,当缓冲区大小增加时,会导致缓冲区搜索时间过长,并且增加了检查点处理的负担。

此外,在PostgreSQL中,对于安装了1GB或更多内存的服务器,推荐设置内存的约25%作为准则。

估计尺寸 = 服务器内存容量 * 25 / 100

工作内存 (work_mem)

增加作业内存中的“work_mem”参数,可以在内存中执行排序和哈希操作,从而基本上提高性能。但在复杂的查询中,排序和哈希操作可能会在查询中多次执行。在这种情况下,需要比work_mem大小多几倍的内存。此外,work_mem与客户端同时连接数成正比,并且还会消耗该数量倍数的物理内存。因此,需要注意的是,由于内存不足而发生交换,反而会导致性能变差。

见解大小 = 服务器内存容量 – (共享缓冲区 + 其他(※)) / 最大连接数

(※)操作系统及中间件所消耗的内存等资源

其他

    • max_connectionsは、アプリケーションに対する同時接続数及びPostgreSQLのスーパユーザによる接続(※)を考慮して設計します。

 

    • (※)superuser_reserved_connections

 

    • データベースの障害対策として接続確立後のデータベース処理時に、アプリケーションが異常終了した場合、タイミングによってはデータベースがアプリケーションの異常を検知できず、不要なプロセスが残存する状態が発生します。本現象の発生により、不必要なメモリが獲得されたままになる可能性がある為、コネクションのタイムアウトとして、「tcp_keepalives_idle」及び「tcp_keepalives_interval」を設定するのが望ましいです。

 

    さくっと設定値見積もるなら、PgTuneがおすすめです。
bannerAds