linux 另一个postgres未启动:“无法Map匿名共享内存”

xsuvu9jc  于 2023-03-17  发布在  Linux
关注(0)|答案(2)|浏览(228)

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

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参数,但没有成功。
x一个一个一个一个x一个一个二个x
我不能减少内存到配置文件,因为这些是我必须使用的设置,虽然我尝试了,但没有成功(我甚至使用了最小值)。
谢谢你的帮助!

编辑1

好吧,我发现了一些奇怪的事情:
1.我从系统中彻底清除了postgresql
1.我重新安装了postgresql
1.启动群集,一切正常
1.已停止群集并使用所需设置编辑配置文件
1.尝试再次启动群集,但出现相同的错误
1.已恢复为默认配置文件,但仍然收到相同的错误。为什么会发生这种情况?
系统有16 GB的RAM。

编辑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

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

sqxo8psd

sqxo8psd1#

我也遇到过类似的问题。当你使用Postgresql数据库时,你应该创建/提供与shared_buffers值相同或更大的交换空间。
如何创建交换文件(例如8 GB):

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

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

/.swapfile swap swap defaults 0 0
hjzp0vay

hjzp0vay2#

正如文档所述:
默认情况下,PostgreSQL分配非常少量的System V共享内存,以及大量的匿名mmap共享内存。
因此,除非您将shared_memory_type更改为sysv,否则您的内核配置是完全无关紧要的。
我可以想到两个可能的错误原因:

  • 内核没有足够的可用内存来满足请求。这可能是因为shared_buffers设置得太大,或因为其他进程使用了太多内存,或因为已经有大量共享内存Map用于其他用途。
  • 您配置了huge_pages = on,但是没有定义大型页面。

相关问题