在Mac OS X 10.6上为PostgreSQL设置SHMMAX等值

26

我正在尝试在本地启动我的PostgreSQL服务器。 但是我收到了一个错误消息:

FATAL:  could not create shared memory segment: Invalid argument
DETAIL:  Failed system call was shmget(key=5432001, size=9781248, 03600).
HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded your kernel's SHMMAX parameter.  You can either reduce the request size or reconfigure the kernel with larger SHMMAX.  To reduce the request size (currently 9781248 bytes), reduce PostgreSQL's shared_buffers parameter (currently 1024) and/or its max_connections parameter (currently 13).
If the request size is already small, it's possible that it is less than your kernel's SHMMIN parameter, in which case raising the request size or reconfiguring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memory configuration.  

我搜索并查看了文档,但我尝试设置 kern.sysv.shmmax 和 kern.sysv.shmall 一切都不起作用。 在 Snow Leopard 上应该设置什么正确的值?我使用 macports 安装了 postgres。


尝试在serverfault.com上询问。 - pilcrow
2
以下是同一问题在Serverfault上的链接:http://serverfault.com/questions/10226/how-to-set-the-shmmax-parameter-on-mac-os-x - wallyqs
更新:Postgres 9.3及更高版本已被重写,仅需要很少量的共享内存。当使用>= 9.3时,不再需要调整内核共享内存限制。http://www.depesz.com/2012/07/12/waiting-for-9-3-dramatically-reduce-system-v-shared-memory-consumption/ - Paul Legato
4个回答

33

您需要增加内核最大共享内存的允许量,使其高于Postgres尝试分配的内存。 (您也可以减少postgresql.conf中的共享缓冲区或最大连接设置,以使Postgres要求更少的内存,但默认值对于大多数用例来说已经相当小了。)

要进行一次性操作,持续到下一次重启:

sudo sysctl -w kern.sysv.shmmax=12582912
sudo sysctl -w kern.sysv.shmall=12582912

根据你的Postgres设置更改确切的数字;它必须大于在日志文件中Postgres所需的值。完成以上两步操作后,应该可以启动Postgres。

为了使更改在重新启动后持久化,编辑/etc/sysctl.conf并在其中设置相同的值。


1
FYI,根据这里的说明,似乎不再需要调整内核设置,因为自Postgres 9.4以来,使用了不同的共享内存机制:"PostgreSQL 9.4及更高版本使用不同的共享内存机制,因此通常不需要调整内核设置。" - Yarin

8

苹果文档详细说明了如何在Snow Leopard下进行调整:

http://support.apple.com/kb/HT4022: Mac OS X Server v10.6: 调整共享内存段数值。

sysctl可以让您暂时更改它们。


4

我知道这是一个老问题,但我认为值得注意的是,如果您只是用PostgreSQL进行开发,您可能可以安全地进入postgres.conf(在执行initdb之后的数据目录)并将shared_buffers变量更改为较低的值。默认值为28MB左右。 但这样做不会影响系统共享内存变量。


3
虽然这样做可以起作用,但即使使用默认值,对于拥有数千兆字节内存的现代系统来说,这个值仍然太小得荒谬。当处理任何复杂数据集和查询时,Postgres在具有更大的shared_buffers和workmem设置时会快得多。更改系统内核设置本身并没有什么问题,只要你能明智地进行操作,而不是随机更改它们。 - Paul Legato

2

警告:此答案已被OS X的更新版本所取代。请参考下面Paul Legato的答案。

在Mac OS X中,系统启动后无法更改shmmax。您需要编辑/etc/rc或/etc/sysctl.conf文件,并注意它必须是4096的倍数。请参见这里


4
重启后,这实际上并不会影响我的系统。 - Paul
10
这不是真的。你可以在运行时使用“sudo sysctl -w”更改shmmax和其他内核设置,而无需重新启动。 - Paul Legato
我想知道有多少人给这个答案点了踩,意识到它已经被新版本的OS X所取代。 - alvherre
1
这真的无关紧要,不是吗?过时的答案不应该仍然存在而没有明显的警告,它们肯定不应该继续被标记为已接受。 - JoshJordan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接