通过pg_proctab()
,我可以看到我们应用程序的连接在 postgres 中每个连接最多可以使用 800MB 的 RAM。通常最多 400MB。(在评论后进行更新以澄清:这些连接来自连接池,大多数时候它们处于空闲状态,中间有查询。400MB 是在连接空闲时测量的。)
我想调查一下这400MB是由什么组成的。例如,为什么是 400MB,而不仅仅是 40MB?我已经查看了应用程序端的 jdbc 连接对象,没有发现任何异常。
我(疯狂)的猜测是,高 RAM 使用率是因为我们的表上有很多分区。
postgres 是否提供了一种方法来查看连接进程的 RAM?我们使用 AWS RDS,所以最好的情况是我不需要服务器访问的方式。
首先,您必须记住,报告为正在使用的部分内存可能是来自共享缓冲区的共享内存,这些内存由所有数据库进程共享。
除此之外,
idle
连接将使用很少的内存,但可能存在以下例外情况:PL/pgSQL 函数中准备好的语句和语句的缓存执行计划使用的内存
用于临时表的内存 (
temp_buffers
)WITH HOLD
游标使用的内存元数据缓存使用的内存(如果您有很多表,则很有趣)