论坛首页> 系统管理

【PG】共享内存段数量满导致数据库无法启动

问题描述:

在为油田用户做主从库扩展时,重启数据库突然无法启动,报错信息如下内容:



问题分析:

报错信息里已经将问题写的很具体了,提示的是创建共享内存段失败

PG在启库的过程中会调用系统头文件里的shmget()函数(创建共享内存)
看下shmget()函数

函数原型:int shmget( key_t key , size_t size , int shmflg )
函数参数:
key: 共享内存的键值,其他进程通过该值访问该共享内存,其中有个特殊值IPC_PRIVATE,表示创建当前进程的私有共享内存
size: 申请的共享内存段的大小
shmflg: IPC_CREAT:如果想获取的共享内存不存在,则创建共享内存。如果存在则返回共享内存操作句柄
IPC_EXCL|IPC_CREAT:如果想获取的共享内存存在,则报错按位或上权限,可以使用8进制的书资来进行参数的按位或
函数返回值:
成功: 共享内存段的标识符(非负整数)
失败: -1

其中key为操作系统建立的新共享内存键值,size为申请的共享内存段大小


解决方法:

开始没仔细看提示信息里的内容,按照以往的经验,以为是共享内存段大小设置的问题,直接调高了内核参数里的shmmaxshmall

问题并没有解决,又尝试减少了PG启动申请的共享内存大小和最大连接数数量,问题依旧

痛定思痛,仔细看了下提示信息里的提示

可以提高SHMMNI参数大小,或者是申请的共享内存大小溢出

使用ipcs -u命令检查共享内存数量

ipcs命令用于报告Linux中进程间通信设施的状态,显示的信息包括消息列表、共享内存和信号量的信息)


发现共享内存数量为4096(截图为4100是修改后检查状态),确实已经占满

root账户修改/etc/sysctl.conf

kernel.shmmni修改为6000

执行sysctl -p使配置生效

再次尝试启动数据库成功


问题思考:

数据库启动的问题虽然解决,但也没完全解决

GeoEast对外安装中,推荐的共享内存段数量为4096,也是操作系统默认的数量,理论上肯定是够用的

好奇到底是什么进程把共享内存段数量占满

使用ipcs -m列出内存段使用情况


可以看到有大量状态是dest(表示已删除,但仍有程序连接着他),内存段并没有被释放

使用lsof |egrep 911085906

查看内存段idshmid)被什么进程占用


检查发现同一个用户下的共享内存段都指向同一个进程

Xvnc,进程号40994

检查下该进程的详细信息

ps -wef|grep 40994

看来是用户使用Xvnc为多个账号提供远程桌面登录造成的

检查dmesg信息里,存在大量用户vnc登录的信息

也就是每个用户使用vnc连接机器时就会申请新的内存段,但是关闭连接窗口并不会释放

40994进程kill掉,该用户下占用的几百个共享内存段就都释放了,问题解决


造成xvnc无法正常释放内存段的原因暂未查明,觉得可以从以下两方面尝试:

1.重启机器

2.根据操作系统版本重新下载安装vnc




相关参考资料:

Linux进程三,进程间通信

https://blog.csdn.net/qq_44828389/article/details/105331418

ipcs命令详解——共享内存、消息队列、信号量定位利器

https://blog.csdn.net/dalongyes/article/details/50616162

Linux shmmax shmall内核参数设置详解总结

https://blog.csdn.net/weixin_44662991/article/details/109913294


全部回复