【问题标题】:Setting SHMMAX etc values on MAC OS X 10.6 for PostgreSQL在 MAC OS X 10.6 for PostgreSQL 上设置 SHMMAX 等值
【发布时间】:2023-07-29 10:04:01
【问题描述】:

我正在尝试在我的本地机器上启动我的 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 上询问。
  • 这里是 serverfault 上相同问题的链接:serverfault.com/questions/10226/…
  • 更新:Postgres 9.3 及更高版本已被重写为只需要少量的共享内存。使用 >= 9.3 时,不再需要调整内核共享内存限制。 depesz.com/2012/07/12/…

标签: postgresql configuration macos


【解决方案1】:

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

一次性执行此操作,持续到下一次重新启动:

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

根据您的 Postgres 设置更改确切的数字;它必须比 Postgres 在日志文件中所要求的要大。完成这两个操作后,您应该可以启动 Postgres。

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

【讨论】:

  • 仅供参考,从 Postgres 9.4 开始,似乎不再需要调整内核设置 - 请参阅 here: "PostgreSQL 9.4 及更高版本使用不同的共享内存机制,因此内核设置通常不会有进行调整。”
【解决方案2】:

Apple 在此处记录了如何针对 Snow Leopard 调整它们:

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

sysctl 确实允许您临时更改它们。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 虽然这可行,但对于具有数 GB 可用内存的现代系统来说,即使是默认值也小得离谱。在处理任何复杂的数据集和查询时,Postgres 在更大的 shared_buffers 和 workmem 设置下运行速度快得多。更改系统内核设置本身并没有错,只要您明智地这样做,而不仅仅是随机更改它们。
    【解决方案4】:

    警告:此答案已被较新版本的 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

    【讨论】:

    • 即使在重新启动后,这实际上也不会影响我的系统。
    • 这不是真的。您可以使用“sudo sysctl -w”在运行时更改 shmmax 和其他内核设置,而无需重新启动。
    • 我想知道有多少人反对这个答案,意识到它已经被新版本的 OS X 淘汰了。
    • 这并不重要,不是吗?过时的答案不应该在没有大警告的情况下仍然存在,当然也不应该继续被标记为已接受。