7 postgresql performance memory
我很幸运能够使用运行 64 位 Ubuntu 的 20GB Linode 实例。我想尝试为此服务优化 PostGres,但我不知道我应该优先更改什么。
我有几个大约 20,000 行的数据集,正在执行的计算是内存密集型查询(空间分析),每次请求后都会写入少量行。用户总数非常少(10 - 50)。
我已经阅读了 Postgresql 站点上的这篇文章,但我对它的工作原理知之甚少,不知道我应该优先考虑什么。我还查看了有关在此处更改地理类型工作的建议。
例如,我尝试将 更改shared_buffers
为200MB
(远小于 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
我建议使用pgtune
Greg Smith 写的。
只需在您的服务器上运行它,如下所示:
pgtune -i postgresql.conf -o postgresql-tuned.conf
Run Code Online (Sandbox Code Playgroud)
它有更多的选择,但只是这样做并使用生成的postgresql.conf
将为您的服务器性能创造奇迹。
我认为 PostgreSQL 应该在标准安装中包含它,甚至默认运行它 - 这样人们就不会抱怨 PostgreSQL 性能不佳。
您需要增加服务器上的 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)