我应该如何为 20 GB 的 RAM 调整 Postgresql?

7 postgresql performance memory

我很幸运能够使用运行 64 位 Ubuntu 的 20GB Linode 实例。我想尝试为此服务优化 PostGres,但我不知道我应该优先更改什么。

我有几个大约 20,000 行的数据集,正在执行的计算是内存密集型查询(空间分析),每次请求后都会写入少量行。用户总数非常少(10 - 50)。

我已经阅读了 Postgresql 站点上的这篇文章,但我对它的工作原理知之甚少,不知道我应该优先考虑什么。我还查看了有关在此处更改地理类型工作的建议。

例如,我尝试将 更改shared_buffers200MB(远小于 20GB 的 75%)。这导致了以下错误消息:

  • 重启 PostgreSQL 9.1 数据库服务器
    • PostgreSQL 服务器启动失败。请检查日志输出:2013-03-10 12:21:58 EDT FATAL:无法创建共享内存段:无效参数 2013-03-10 12:21:58 EDT 详细信息:失败的系统调用是 shmget(key=5432001 , 大小 = 47742976, 03600)。2013-03-10 12:21:58 EDT 提示:此错误通常意味着 PostgreSQL 对共享内存段的请求超出了内核的 SHMMAX 参数。您可以减小请求大小或使用更大的 SHMMAX 重新配置内核。要减少请求大小(当前为 47742976 字节),请减少 PostgreSQL 的共享内存使用量,可能是通过减少 shared_buffers 或 max_connections。如果请求大小已经很小,它可能小于内核的 SHMMIN 参数,在这种情况下,需要提高请求大小或重新配置 SHMMIN。PostgreSQL 文档包含有关共享内存配置的更多信息。

我将其恢复为原始值并尝试更改:

work_mem = 50MB
maintenance_work_mem = 256MB 
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道我应该尝试改变哪些值,或者我应该如何优先考虑哪些值是试验和测试的关键。我应该具体做什么来优化这个数据库?

小智 14

我建议使用pgtuneGreg Smith 写的。

只需在您的服务器上运行它,如下所示:

pgtune -i postgresql.conf -o postgresql-tuned.conf
Run Code Online (Sandbox Code Playgroud)

它有更多的选择,但只是这样做并使用生成的postgresql.conf将为您的服务器性能创造奇迹。

我认为 PostgreSQL 应该在标准安装中包含它,甚至默认运行它 - 这样人们就不会抱怨 PostgreSQL 性能不佳。

  • 极好的!这正是我所需要的。我偶然发现了一些设置,但对我应该更改的所有内容并不熟悉。 (2认同)
  • +1 有用的工具。自 Postgres 8.4 以来没有得到太多更新。但大部分仍然适用于最新版本 9.2。 (2认同)

Chr*_*son 5

您需要增加服务器上的 shmmax、shmall、msgmax 和 msgmnb 设置。正如另一个答案中提到的,PGTUNE 应该告诉您将它们设置为什么。

你可以这样做:

sysctl -w kernel.shmmax={{value}}
sysctl -w kernel.shmall={{value}}
sysctl -w kernel.msgmax={{value}}
sysctl -w kernel.msgmnb={{value}}
Run Code Online (Sandbox Code Playgroud)

您可以检查已经存在的值,如下所示:

cat /proc/sys/kernel/shmmax
cat /proc/sys/kernel/shmmall
cat /proc/sys/kernel/msgmax
cat /proc/sys/kernel/msgmnb
Run Code Online (Sandbox Code Playgroud)