从Oracle数据库故障到Linux nproc算法

某日,朋友跟我讨论他巡检oracle数据库时遇到的一个情况,在使用root用户切换grid用户时报错
-bash: fork: retry: Resource temporarily unavailable,一般这个报错都是因为
/etc/security/limits.conf或/etc/security/limits.d/下相关用户nproc设置过小导致,
但是定位一波三折,最终了解清楚了nproc参数生成、限制,将案例详细分享,供大家参考。

故障背景

巡检su – grid无法完成切换,报错

-bash: fork: retry: Resource temporarily unavailable。

环境介绍

操作系统为Redhat 6.8,数据库版本为Oracle 11.2.0.4 RAC。

初步分析,获取已存在进程limits环境设置

根据经验,上述报错一般为下面三个原因:

  1. 用户的nproc达到限制,无法创建新的进程
  2. 系统没有可分配的的pid,即进程号已经达到内核参数kernel.pid_max的限制
  3. 系统可用内存低,新的进程无法申请到内存导致不能启动

下面我们一步一步排查:
检查用户已经存在进程limits设置与用户ulimit设置,检查如下:
如果已经有会话登陆grid用户,可以通过下面命令得到当前限制
image.png

如果已经无法正确切换grid用户,可以使用如下步骤得到限制

第一步:获取grid用户任意进程pid

image.png

第二步:使用cat查看/proc//limits获取限制设置

image.png

  • 可以看到上述无论是已经登陆grid还是真实进程设置均为16384,设置均不算过低,RHEL默认/etc/sysctl.conf中内核参数kernel.pid_max为32768也足够使用,grid用户一般不会占用这么多的process,那到底是由于bug还是其他原因耗尽了设置呢还是内存或其他原因?

进一步分析,寻找limits.conf未生效原因

经过初步分析,初步判断并非设置过小导致,16384设置并不算小,那接下来需要排查如下:

  1. /etc/security/limits.conf与/etc/security/limits.d是否设置过低 ?
  2. 是否/etc/profile、/etc/profile.d/、/etc/bashrc、家目录下.bashrc、.bash_profile是否有相关ulimit配置脚本设置nproc设置过低 ?
  3. 是否grid用户下真有超过16384 pro
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值