Performance 强制PostgreSQL释放分配的内存

Performance 强制PostgreSQL释放分配的内存,performance,postgresql,profiling,Performance,Postgresql,Profiling,我的Postgres在负载(500MB)下达到最大允许内存,并运行14个进程。加载结束后,Postgres仍保留分配的内存并运行14个进程。由于Apache和Tomcat在同一台机器上运行,我希望Postgresql释放分配的内存。可能吗 谢谢 除了一些常见的进程外,PostgreSQL会对每个连接运行进程,因此您可能应该查看应用程序(或连接池)设置—如果连接在一段时间内未使用,则会被释放 但我不认为这对内存环境有多大帮助,因为PG分配的内存的大部分是共享缓冲区,这部分内存永远不会被释放。Pos

我的Postgres在负载(500MB)下达到最大允许内存,并运行14个进程。加载结束后,Postgres仍保留分配的内存并运行14个进程。由于Apache和Tomcat在同一台机器上运行,我希望Postgresql释放分配的内存。可能吗


谢谢

除了一些常见的进程外,PostgreSQL会对每个连接运行进程,因此您可能应该查看应用程序(或连接池)设置—如果连接在一段时间内未使用,则会被释放


但我不认为这对内存环境有多大帮助,因为PG分配的内存的大部分是共享缓冲区,这部分内存永远不会被释放。

Postgres使用大量内存通常是一件好事,因为它必须使用更少的磁盘。如果它可以在内存中存储索引和最常用的数据块,那么就可以实现非常高的缓存命中率,从而提高性能,减少Java应用服务器在等待事务完成时阻塞请求的麻烦

因此,一般来说,您希望postgresql的缓存能够快速预热并保留在内存中

也就是说,你当然也需要内存来运行其他应用程序。通过减少连接池上的最大连接数,可以减少每个请求的内存消耗。这反过来又会限制Postgre为处理请求和存储基于会话的临时数据而启动的进程的数量

当然,您可以调整共享缓冲区以获得较小的缓存


另一种方法是减少允许Apache和tomcat处理的并发请求数量。如果您的响应时间很快,那么您可能能够通过减少并发请求并在apache中对请求进行排队来获得更高的吞吐量。然后,您可以限制整个堆栈中的内存消耗,并通过在负载上设置一个上限,使请求处理时间保持相对恒定。

在理想的设置中,您永远不会让数据库位于web服务器和应用程序服务器上。因此,这些系统中的每一个都可能位于自己的服务器上

基本上,您需要从两个方面查看系统内存,特别是Postgres内存

首先,是运行应用程序所需的内存。这本质上是所有应用程序在生产环境中运行时的静态内存负载。如果在所需的负载下没有足够的内存,那么就没有足够的内存。现代系统可以在“危机”时期使用互换,但仅此而已。简单地说,如果您使用的是swap,那么您会出现内存危机,您应该希望它很快消失

一旦有了应用程序所需的基本内存,所有剩余的系统内存基本上都专用于磁盘缓存

对于承载Postgres的系统,您有两种磁盘缓存。你有内核文件系统缓存,还有Postgres内部缓存

Postgres内部缓存不会被释放。这不是它的工作原理。您在配置中告诉它,它可以使用XXX数量的RAM来实现其目的,并且它将保留它。在这种状态下,Postgres不关心系统上还有什么

如果缓存是内核缓存,并且文件系统活动突然出现非Postgres的峰值,那么内核将缓存最近的页面并刷新旧页面。内核缓存将看到整个系统,而Postgres只看到DB活动

所以

在Postgres的世界视图中,内核缓存与其缓冲区缓存竞争。考虑一下这个场景。Postgres要求提供一块磁盘。内核抓取该块并缓存它。同时,Postgres从内核获取该块,并将其缓存。现在,该块被冗余缓存。如果内核发现该块缓存内存有更好的用途,它会将其从Postgres块中清除,并加载新的块。同时,Postgres将在其内部缓存中保留该块

如果你有一台专用的Postgres机器,就没有理由有太多的内核缓存。由于所有磁盘I/O都将是Postgres I/O,因此内核缓存是冗余的,效率低于Postgres缓存。当Postgres缓存一个块时,它必须封送其中的字节,更新它的内部结构以及它所做的任何其他事情。一旦缓存,它就不再需要执行任何操作。因此,通过这种方式,Postgres缓存的块比内核缓存的块更有效,因为将块从内核缓存移动到Postgres会有一些开销

然而,如果您有一台混合使用的机器,那么内核和Postges缓存将不得不解决这个问题。如果您有一个足够小的DB,可以将大部分日常操作数据放入RAM中,那么您应该有足够的缓冲区空间来处理Postgres中的数据,以便它的大部分操作都来自内存。这样,Postgres将加载一次正常的“繁忙”页面,并缓存它们,然后再也不会向内核请求它们。一旦完成,内核就可以使用其缓冲缓存来处理所有其他辅助系统请求

在另一个极端,你给Postgres很少的专用缓冲区缓存,让它完全依赖内核缓存。这样一来,每次从内核缓存中读取每个数据块都会稍微贵一点,但比每次从磁盘读取要便宜得多。通过这种方式,内核可以判断哪些进程更值得缓存关注

在实践中,为博士后确定一个良好的运行、稳定的状态,并保持这种状态。内核缓存将缓解活动中的任何峰值(比如对报告或其他内容的大表扫描),当峰值结束时,内核可以恢复该内存用于其他用途

所以,归根结底,博士后是不会回馈任何记忆的。Onl