我注意到有几个关于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:
好吧,我发现了一些奇怪的事情:
- 我从系统中彻底清除了postgresql 我重新安装了postgresql
- 启动集群,一切正常
- 停止集群并使用我需要的设置编辑配置文件
- 尝试再次启动群集,但得到相同的错误
- 恢复到默认配置文件,但仍然得到相同的错误。为什么会发生这种情况?
系统内存为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
命令创建的。清除此文件内容将设置重置为系统默认设置并修复错误。