另一个帖子没有开始:"could not map anonymous shared memory"



我注意到有几个关于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.

我试着检查和修改内核参数,但没有工作。

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

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

谢谢你的帮助!

编辑1:

好吧,我发现了一些奇怪的事情:

  1. 我从系统中彻底清除了postgresql
  2. 我重新安装了postgresql
  3. 启动集群,一切正常
  4. 停止集群并使用我需要的设置编辑配置文件
  5. 尝试再次启动群集,但得到相同的错误
  6. 恢复到默认配置文件,但仍然得到相同的错误。为什么会发生这种情况?

系统内存为16gb。

EDIT 2: add DETAILS

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

两个服务器之间的共享内存和段基本相同。当我启动集群时,它立即失败了,所以这可能是一个线索。目标服务器是一台EC2机器。

我不知道我还能做什么。

EDIT 3: OTHER DETAILS

这是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

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

我也遇到过类似的问题。当你使用Postgresql DB时,你应该创建/提供与shared_buffers值相同或更大的交换空间。

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

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

然后添加swap文件到/etc/fstab:

/.swapfile swap swap defaults 0 0

正如文档所说:

默认情况下,PostgreSQL分配了非常少量的System V共享内存,而匿名mmap共享内存的数量要大得多。

因此,除非您将shared_memory_type更改为sysv,否则您的内核配置是相当无关的。

对于这个错误,我可以想到两个可能的原因:
  • 内核没有足够的可用内存来满足请求。这可能是因为shared_buffers设置得太大,或者因为其他进程使用了太多的内存,或者因为已经有很多共享内存映射用于其他目的。

  • 您配置了huge_pages = on,但是没有定义大页面。

在尝试了几个小时的不同配置后,重新启动我的服务器为我修复了这个问题。

sudo reboot

在我的例子中,它是postgresql.auto.conf文件,我自己用ALTER SYSTEM命令创建的。清除此文件内容将设置重置为系统默认设置并修复错误。

相关内容

最新更新