发表人:chengshi 2022-04-21 17:05:00 最新回复: 2023-03-27 08:39:38
问题描述:
在为油田用户做主从库扩展时,重启数据库突然无法启动,报错信息如下内容:

问题分析:
报错信息里已经将问题写的很具体了,提示的是创建共享内存段失败
PG在启库的过程中会调用系统头文件里的shmget()函数(创建共享内存)
看下shmget()函数
其中key为操作系统建立的新共享内存键值,size为申请的共享内存段大小
解决方法:
开始没仔细看提示信息里的内容,按照以往的经验,以为是共享内存段大小设置的问题,直接调高了内核参数里的shmmax和shmall值
问题并没有解决,又尝试减少了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
查看内存段id(shmid)被什么进程占用

检查发现同一个用户下的共享内存段都指向同一个进程
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
|
|