因此,我的朋友说交换是一个老概念,只要有足够的 RAM,在新系统上就不需要交换。但后来我听到有人建议,在 Linux 甚至 Unix 上使用 Postgres 时可能确实需要交换,因为malloc/free不会将内存返回给系统。我被告知这是一个功能,而不是错误,我应该使用交换,因为系统将使用交换来释放内存……这是正确的还是我遗漏了什么?有人可以确认这一点并可能对此提供更多解释吗?

我的背景设置:

  • PGSQL 配置:shared_buffers+(temp_buffers+ work_mem)* max_connections= 20 GB;
  • PGSQL 是版本 16,服务器在 Ubuntu 22 上。
  • 该服务器有 50 GB 的 RAM 和 0 个交换空间。ZFS ARC 的最大容量为 8 GB。
  • 事实上,几个小时后就超过了 20 GB。
  • 我每天都会看到 RAM 使用量有所增加。5-7 天内达到 50 GB(PGSQL 重启时降至 0)。

这就是背景。本质上,问题是:我是否需要或应该为带有 Postgres 服务器的 VM 进行交换?

4

  • 检查/proc/pressure/memory/proc/meminfoInactive(anon)如果您的内存压力很大且有大量非活动内存,则启用交换可能会很有用。


    – 

  • 目前这个值为零或低,但 postgres 刚刚重新启动。cat /proc/pressure/memory一些 avg10=0.00 avg60=0.00 avg300=0.00 total=1909323617 完整 avg10=0.00 avg60=0.00 avg300=0.00 total=1894853199grep "Inactive(anon)" /proc/meminfo不活动(匿名):17904 kB


    – 

  • 重新启动后,这些统计数据就毫无用处了。


    – 

  • 您需要系统有多可靠?阅读有关”的文章。我会选择基于“可靠性”和“可用性”等旧概念构建的系统,而不是“我们会对进程撒谎,告知它们可以使用多少内存,如果内存用完了,我们就会杀死它们,直到我们有足够的内存”。在系统上放置足够的内存,为预期用途添加适当数量的交换,然后禁用 OOM 杀手和所有内存过量使用。这个“旧概念”意味着您的数据库服务器将是可靠的。要有比“我们希望这会起作用”更高的标准。


    – 



最佳答案
1

实际上,拥有一些交换空间更为安全,这样当系统耗尽物理内存时,系统将减速,而不是立即终止进程。简而言之,在现代系统中,交换空间是一种您可能永远不需要的保险。

您可以在此处找到类似的、包含许多论点的讨论: