Another postgres not starting: "could not map anonymous shared memory"

问题描述 投票:0回答:2

我注意到有几个关于 Postgres (10) 由于共享内存而无法启动的问题;尽管如此,我还是无法让它运行起来。现在每次我尝试启动集群时,我都会收到此错误:

2021-10-24 10:13:43.269 UTC  [11253] FATAL:  could not map anonymous shared memory: Cannot allocate memory
2021-10-24 10:13:43.269 UTC  [11253] HINT:  This error usually means that PostgreSQL's request for a shared memory segment exceeded available memory, swap space, or huge pages. To reduce the request size (currently 5507432448 bytes), reduce PostgreSQL's shared memory usage, perhaps by reducing shared_buffers or max_connections.

我尝试查看并修改内核shmall参数,但是没用

~$ cat /proc/sys/kernel/shmall
18446744073692774399
~$ cat /proc/sys/kernel/shmmax
18446744073692774399

我无法将内存减少到配置文件中,因为这些是我必须使用的设置,尽管我尝试了但没有成功(我什至使用了最小值)。

感谢您的帮助!

编辑 1

好吧,我发现了一些奇怪的东西:

  1. 我从系统中完全清除了postgresql
  2. 我重新安装了postgresql
  3. 启动集群一切顺利
  4. 停止集群并使用我需要的设置编辑配置文件
  5. 再次尝试启动集群却出现同样的错误
  6. 恢复到默认配置文件但仍然出现相同的错误。为什么会这样?

系统有 16 GB 的内存。

编辑 2:添加细节

好吧,基本上我必须通过移动数据目录来迁移 postgresql 数据库。这是它唯一能做的事。完全移动数据文件夹后,这里是错误。 我注意到没有交换内存,所以我创建了它,但仍然有同样的错误。

两台服务器的共享内存和段基本一致。当我启动集群时它立即失败,所以也许这对你来说是一个线索。目标服务器是 EC2 机器。

我不知道我还能做什么..

编辑 3:其他细节

这是命令 lsipc 显示的内容:

RESOURCE DESCRIPTION                                              LIMIT USED  USE%
MSGMNI   Number of message queues                                 32000    0 0.00%
MSGMAX   Max size of message (bytes)                               8192    -     -
MSGMNB   Default max size of queue (bytes)                        16384    -     -
SHMMNI   Shared memory segments                                    4096    0 0.00%
SHMALL   Shared memory pages                       18446744073692774399    0 0.00%
SHMMAX   Max size of shared memory segment (bytes) 18446744073692774399    -     -
SHMMIN   Min size of shared memory segment (bytes)                    1    -     -
SEMMNI   Number of semaphore identifiers                          32000    0 0.00%
SEMMNS   Total number of semaphores                          1024000000    0 0.00%
SEMMSL   Max semaphores per semaphore set.                        32000    -     -
SEMOPM   Max number of operations per semop(2)                      500    -     -
SEMVMX   Semaphore max value                                      32767    -     -

这些值与我尝试迁移的源计算机相同。数据目录与原始目录相同,但我每次都使用此命令:

sudo pg_ctlcluster 10 main start

我得到同样的错误。我真的需要帮助!

linux postgresql amazon-ec2 shared-memory postgresql-10
2个回答
0
投票

我有类似的问题。当您使用 Postgresql 数据库时,您应该创建/提供大小相同或大于 shared_buffers 值的交换空间。

如何创建交换文件(例如 8GB):

sudo fallocate -l 8G /.swapfile; sudo chmod 600 /.swapfile; sudo mkswap /.swapfile; sudo swapon /.swapfile; 

然后将交换文件添加到 /etc/fstab:

/.swapfile swap swap defaults 0 0

-1
投票

正如文档所说:

默认情况下,PostgreSQL 分配非常少量的 System V 共享内存,以及大量的匿名

mmap
共享内存。

因此,除非您将

shared_memory_type
更改为
sysv
,否则您的内核配置是无关紧要的。

我可以想到两个可能的错误原因:

  • 内核没有足够的可用内存来满足请求。这可能是因为

    shared_buffers
    设置太大,或者因为其他进程使用了太多内存,或者因为已经有很多共享内存映射用于其他目的。

  • 您配置了

    huge_pages = on
    ,但是没有定义大页面。

© www.soinside.com 2019 - 2024. All rights reserved.