我注意到有几个关于 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:
好吧,我发现了一些奇怪的东西:
系统有 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
我得到同样的错误。我真的需要帮助!
我有类似的问题。当您使用 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
正如文档所说:
默认情况下,PostgreSQL 分配非常少量的 System V 共享内存,以及大量的匿名
共享内存。mmap
shared_memory_type
更改为 sysv
,否则您的内核配置是无关紧要的。
我可以想到两个可能的错误原因:
内核没有足够的可用内存来满足请求。这可能是因为
shared_buffers
设置太大,或者因为其他进程使用了太多内存,或者因为已经有很多共享内存映射用于其他目的。
您配置了
huge_pages = on
,但是没有定义大页面。