强制 PostgreSQL 释放分配的内存

2024-01-27

我的 Postgres 在负载下达到了最大允许内存 (500MB) 并运行 14 个进程。一旦加载结束,Postgres 仍然保留分配的内存并运行 14 个进程。由于我有 Apache 和 Tomcat 在同一台机器上运行,我想 Postgresql 释放分配的内存。是否可以?

Thanks!


基本上,您需要通过两种方式查看系统内存,特别是 Postgres 内存。

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

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

对于托管 Postgres 的系统,您有两种磁盘缓存。您有内核文件系统缓存,并且有 Postgres 内部缓存。

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

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

So.

在 Postgres 的世界观中,内核缓存正在与其缓冲区缓存竞争。考虑这种情况。 Postgres 请求一块磁盘。内核获取该块并缓存它。同时,Postgres 从内核中获取该块,并将其缓存起来。现在,该块已被冗余缓存。如果内核发现该缓存内存块有更好的用途,它会将其从 Postgres 块中清除,并加载新的。同时,Postgres 会将该块保留在其内部缓存中。

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

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

在另一个极端,您为 Postgres 提供很少的专用缓冲区缓存,并让它仅依赖于内核缓存。这样,每次从内核缓存中读取每个块的成本都会稍高一些,但它比每次从磁盘读取要便宜得多。这样内核就可以判断哪些进程更值得缓存关注。

在实践中,为 Postgres 确定一个良好的可操作、稳定的状态,然后就这样。任何活动峰值(比如对报告或其他内容进行大表扫描)都将通过内核缓存来缓解,当峰值结束时,内核可以恢复该内存以供其他用途。

因此,最重要的是,Postgres 不会归还任何内存。只给予你所能奉献的一切。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制 PostgreSQL 释放分配的内存 的相关文章

随机推荐

  • 如何在json渲染中获取完整的belongs_to对象?

    基本上 我有一个属于 company 的对象 并具有 company id 属性 当我渲染 json coupons 时 JSON 是否可以包含其所有者的属性而不是 company id 你也许可以做类似的事情render json gt
  • Python argparse:如何将“--add”更改为“add”,同时仍然是可选参数?

    我想要这个功能 python program py add Peter Peter was added to the list of names 我可以通过以下方式实现这一点 add代替add像这样 import argparse pars
  • MACOSX - 如何自定义 IKImageBrowserView 以在每个项目上添加 NSButton?

    我想自定义 IKImageBrowserView 以便我可以在 IKImageBrowserView 的单元格上添加 NSButton 或其他控件 我尝试剪切 IKBrowserViewCell 类 但我不知道如何以及在哪里添加 NSbut
  • libGDX中如何处理不同的宽高比?

    我已经使用 libGDX 实现了一些屏幕 显然会使用ScreenlibGDX 框架提供的类 但是 这些屏幕的实现仅适用于预定义的屏幕尺寸 例如 如果精灵适用于 640 x 480 尺寸的屏幕 4 3 宽高比 则它不会在其他屏幕尺寸上按预期工
  • 从命令行调用 Roslyn 分析器

    在 Visual Studio 2015 中进行开发时使用 Roslyn 分析器非常棒 然而 如果能够从预提交挂钩或像 TeamCity 这样的 CI 调用分析器 以确保标记不合格的代码 那就更好了 有没有办法通过调用命令行实用程序来获取分
  • C# double 的尾数标准化

    编辑 现在开始工作 在规范化螳螂时 首先设置隐式位很重要 在解码隐式位时不必添加 我将标记的答案保留为正确的 因为那里的信息确实有帮助 我目前正在实现一种编码 可区分编码规则 并且在编码双值时遇到一些小问题 因此 我可以使用以下方法从 c
  • 使用单选按钮更改表单操作

    我想实现类似于带有单选按钮的谷歌搜索的东西 根据所选的单选按钮 将更改搜索类型 搜索 图像 视频等 现在我有 div div
  • 在 Node.js 和 Sass 之间共享配置变量

    我正在开发一个具有客户端 服务器架构的浏览器游戏 该游戏涉及一个 HTML 画布作为游乐场 我希望能够在单个配置文件中设置该画布的尺寸 然后在 CSS 中重用它 1 来定义画布的实际尺寸和 2 在游戏服务器的代码中用于碰撞和其他内容 做这个
  • Consul HTTP请求获取所有kv值

    我需要得到所有consul使用 http api 的 kv 值 目前我可以使用以下命令获取一个值 curl k X GET https consul banuka1 us east 2 test 8543 v1 kv banuka test
  • Android SDK 彩信

    有谁知道如何通过 Android SDK 以编程方式发送彩信 任何版本的 SDK 都可以 只需要知道从哪里开始 我知道如何发送 接收短信 现在我需要在发送之前在消息中添加图片 这对我有用 Intent sendIntent new Inte
  • 我们能否仅通过后序遍历或先序遍历来构造一棵满二叉树?

    例如 我们只提供后序遍历数组或者只提供前序遍历数组 我们可以重建二叉树吗 如果我们知道二叉树是满的 此外 如果不是 如果同时知道前序和后序 是否可以构造完整的二进制文件 不 你不能仅凭一份清单 想想邮购清单 4 5 2 3 1 1 1 2
  • 核心数据和 iTunes 文件共享 - 在应用程序更新时移动/隐藏 .sqlite 文件?

    我有一个 iPad 应用程序 它使用 Core Data 进行数据存储 我想在 iTunes 中启用文件共享 但我真的不希望用户能够删除或修改 sqlite 文件 我可以将该文件移动到其他隐藏目录吗 或者 可以将该文件设置为只读吗 只要文件
  • ARC 应用程序在 google chrome 45 上崩溃

    今天 当使用 arc 运行时测试 Android 应用程序时 由于某种原因 它在我没有注意到的情况下进行了更新 我得到的只是它立即崩溃 我尝试过使用电弧焊机重新包装 但不知何故也更新了但没有结果 更新 因为我在稳定通道上没有看到任何进展 所
  • 如何检查我的 AVPlayer 是否正在缓冲?

    我想检测我的 AVPlayer 是否正在缓冲当前位置 以便我可以显示加载程序或其他内容 但我似乎在 AVPlayer 的文档中找不到任何内容 你可以观察你的价值观player currentItem playerItem addObserv
  • Magento 中 /app/code/core/Mage/Core/Model/Resource/Resource.php 出现致命错误

    刚刚将 Magento 安装从 1 5 升级到 1 6 并出现以下错误 致命错误 在非对象上调用成员函数 insert hsphere local home t21004 XXXXXXXXXXXXX com app code core Ma
  • 需要 C# 程序集来松散引用强命名程序集

    所以问题就在这里 我正在编写一些 StyleCop 插件程序集 供我工作的公司使用 因此 这些程序集需要引用强命名的 Microsoft StyleCop CSharp dll 问题在于 如果我构建这个并将其传递给我组中的开发人员 他们必须
  • 使用内置 Hive 运行 Spark 并为 Hive Metastore 配置远程 PostgreSQL 数据库

    我正在运行带有内置 Hive 的 Spark v1 0 1 使用 SPARK HIVE true sbt sbt 程序集 程序集安装 Spark 我还配置 Hive 将 Metastore 存储在 PostgreSQL 数据库中 如下所示
  • Conda 包冲突,Geopandas

    在通过 conda forge 命令在终端中失败后 尝试在我的环境中安装 geopandas 时 我收到以下错误 有没有办法更新和修复这个问题 Output in format Requested package gt Available
  • 使用 matlab 求解 ode 系统

    我有 9 个带有时间相关系数的方程g MY M file function dy tarak t y G 3 16 g 0 1 exp t 200 90 2 dy zeros 9 1 dy 1 2 2 y 1 2 G y 5 2 g y 7
  • 强制 PostgreSQL 释放分配的内存

    我的 Postgres 在负载下达到了最大允许内存 500MB 并运行 14 个进程 一旦加载结束 Postgres 仍然保留分配的内存并运行 14 个进程 由于我有 Apache 和 Tomcat 在同一台机器上运行 我想 Postgre