点击上方"蓝字"
关注我们吧!
概述
文章主要围绕OS内核参数kernel.sem来讲解。在各类DB(ORA、PG、MYSQL等)安装手册中都会引导大家设置sem这个参数,很多初中级DBA大多是照本宣科并不明白其中含义,更不清楚如何设置才是正确的,在真实的高负载生产环境中未正确设置这个参数真的会产生“生产事故”。写本文的目的是引导DBA同仁避免和我一样踩到信号量的坑里去。
01
参数含义
kernel.sem = SEMMSL SEMMNS SEMOPM SEMMNI
SEMMSL: Maximum number of semaphores per set(每个信号量组中信号量最大数量)
SEMMNS: Maximum number of semaphores system-wide(整个Linux系统中所有信号量的最大数量,建议是第1和第4个数字的乘积)
SEMOPM: Maximum number of semaphore operations per system call(每次semop系统调用可以同时执行的最大信号量操作的数量semopm。由于一个信号量组最多拥有SEMMSL个信号量,推荐将SEMOPM设置为SEMMSL的值)
SEMMNI: Maximum number of semaphore sets for the entire Linux system(设置系统中信号量组的最大数量)
02
查看当前的信号量方法
# cat /proc/sys/kernel/sem
250 32000 32 128 (这几个值分别是:SEMMSL, SEMMNS, SEMOPM, and SEMMNI)
接下来我详细描述一下自己遇到的两个真实案例。
案例1:信号量设置过小引发的链接故障
背景:这是一套客户的核心RAC 2节点数据库,日常会话连接数稳定在12000左右。2019年12月3日凌晨因数据库session连接激增,单节点会话增加到164xx的时候就无法继续增加连接,而我们的process限制为30000。
贴出当时环境的会话连接信息:
查看当时alert日志:
节点1:
Process m000 died, see its trace file
Process m000 died, see its trace file
2019-12-03T01:26:04.312179+08:00
Process J000 died, see its trace file
2019-12-03T01:26:04.312263+08:00
kkjcre1p: unable to spawn jobq slave process
节点2
WAR