2010-01-06 140 views
24

我试图在本地机器上启动我的PostgreSQL服务器。 但我得到一个错误信息说:在MAC OS X 10.6上为PostgreSQL设置SHMMAX等值

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工作。 雪豹的正确设置是什么?我用macports安装了postgres。

+0

尝试在serverfault.com上询问。 – pilcrow 2010-01-06 23:02:30

+2

这里是链接到同一个问题在serverfault:http://serverfault.com/questions/10226/how-to-set-the-shmmax-parameter-on-mac-os-x – wallyqs 2010-11-21 06:46:13

+0

更新:Postgres 9.3及更高版本已被重写为只需要少量的共享内存。当使用> = 9.3时,不再需要调整内核共享内存限制。 http://www.depesz.com/2012/07/12/waiting-for-9-3-dramatically-reduce-system-v-shared-memory-consumption/ – 2013-05-08 19:18:58

回答

2

警告:这个答案已经被较新版本的OS X所取代,请参考下面的Paul Legato的回答。

在Mac OS X中,系统启动后无法更改shmmax。您需要编辑/ etc/rc或/etc/sysctl.conf,并记住它需要是4096的倍数。看到这里 http://www.postgresql.org/docs/8.4/static/kernel-resources.html

+4

这实际上并不影响我的系统,即使在重启。 – Paul 2011-09-24 05:53:44

+9

这是不正确的。您可以在运行时更改shmmax和其他内核设置,而无需重启,使用“sudo sysctl -w”。 – 2012-05-17 02:30:35

+0

我不知道有多少人回答这个问题,他们发现它已经被更新版本的OS X所淘汰。 – alvherre 2013-07-02 02:53:05

4

我知道这是一个老问题,但我认为它可能值得注意的是如果您只是将PostgreSQL用于开发目的您可能会安全地进入postgres.conf(完成initdb之后的数据目录)并将shared_buffers变量更改为某种降低。它默认为28MB或其他东西。 但这样你就不会搞乱系统共享内存变量。

+2

虽然这会起作用,但即使默认值对于具有多个千兆字节的可用内存的现代系统来说也是荒谬的小。在处理数据集和查询任何复杂性时,Postgres以更大的shared_buffers和workmem设置运行*速度更快。如果你正在聪明地做,而不是随意更改系统内核设置,那么改变系统内核设置本身就没有什么问题。 – 2013-01-01 21:39:39

26

您必须将内核的最大共享内存允许增加到比Postgres试图分配的更高的值。 (您也可以减少postgresql.conf中的共享缓冲区或最大连接设置,以使Postgres请求更少的内存,但对于大多数使用情况,默认值已经相当小)。

要做到这一点,持续到下一次重新启动:

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

根据您的Postgres设置更改确切的数字;它必须大于Postgres在日志文件中要求的大小。做完这两个之后,你应该可以启动Postgres。

要使更改在重新启动时保持不变,请编辑/etc/sysctl.conf并在其中设置相同的值。