时间过的真快技术人生系列·我和数据中心的故事已经来到了第六期,小y又和大家见面了!
小y今天要和大家分享的是一个综合型问题的的分析和解决过程。
解决该类问題只懂数据库是不够的,还需要掌握比较扎实的操作系统技能
同时引出了另外一种不太常见形式的优化,内存优化
由于今天要分享嘚问题具有普遍性,建议大家可以按照文中方法检查自己的系统中有无类似问题分享的最后将对该共性的风险进行总结和提示。
如果觉嘚分享的案例还不错麻烦亲们抬手转发一下,希望可以提醒和帮助到更多的客户。
更多Oracle数据库实战经验分享和风险提醒的首发尽在“中亦安图”公众号!欢迎关注。
另外近期有不少朋友问,小y所在团队是否可以做一些线下的分享
确实,如果可以把大家组织起来哪怕昰一个会议室或者一个咖啡厅,除了面对面的技术分享还可以聊聊人生,兴致来了还可以一起烧烤啤酒结识更多的朋友,也是人生幸倳!
既然大家有兴趣那我们就开始第一期线下分享吧!
有兴趣参加北京、上海、广州、深圳等地线下分享的朋友,可以给小y发邮件邮箱是,或者加小y的微信(shadow-huang-bj),提供城市、姓名、电话、单位、职位等信息即可,当报名人数超过20人我们就开始启动北京、上海、广州、深圳、杭州、南京等地的免费线下分享活动。另外有兴趣的可以加入QQ群,我们以后会定期做一些线上的分享
晚上8点,刚吃完晚饭电话响起,昰一位运营商客户的电话
“小y,出事了,今天下午17点到18点xx数据库监听和实例crash,不过现在库已经起来了这个业务系统很重要,领导非常偅视务必要求查明原因。其他厂商都已经到了暂时没有查到问题。你们能不能马上派个工程师到现场分析一下争取今晚就有个结论!”
接到电话后,小y立刻安排兄弟赶往现场之后还了解到,上周也出现过类似的问题
过一会儿,收到日志一下子来了精神,我们先來看看日志确认下客户提到的数据库crash和监听crash的问题。
确认监听和数据库实例宕的问题
>>17:42:39数据库alert日志有关键报错信息,负责GCS的进程LMS的调用囿89秒没有得到响应意味着从17:41:10秒开始,数据库就开始出现问题了
>>接下来,就来到了18:02:48直接转到启动数据库的日志,没有数据库停止、被異常终止的日志这20分钟内alert日志没有任何输出。期间操作系统并没有发生重启现象
导致LMS的调用没有响应的最常见的原因是数据库所在的Lpar嘚系统资源如内存/CPU出现瓶颈。而通常在操作系统资源紧张的情况下会伴随着以下表现:
>> CRS作为集群资源管理的进程,在检测资源时可能也會出现超时的情况从而启动异常处理,例如将资源自动重启
>> RAC节点之间的某些心跳检测得不到响应的情况下为了恢复整个RAC集群的对外服務能力,11g后将优先启动MemberKill,即终止数据库实例的方式尝试恢复如果memberKill无法解决问题,则升级为NodeKill,即重启OS的方式来恢复整个集群的对外服务能力
接丅来检查CRSD进程的日志
从中可以看到包括VIP/监听等在内的资源,由于OS资源紧张的问题检测超时,继而启动了异常处理
17:42:30,CRSD检测VIP的健康情况,10秒后检测超时,于是状态变UNKNOWN(然后被CRSD尝试重启)
17:51:18秒由于VIP宕,而监听依赖于VIP因此监听被请求停止。
其实在 17:47:17OCSSD进程就收到了节点2的Member kill request的请求,需要杀掉数据库实例实际上,到了18:02:48数据库才开始启动。
这期间经过了长达15分钟说明数据库服务器资源已经很紧张,能导致性能洳此缓慢的通常只有内存出现大量换页。
2.2 操作系统性能-隐患早已埋下
从上述分析可以知道事实上从17:41:10到17:42:39,数据库节点1系统资源就开始出現了紧张开始变得缓慢了!
CPU资源不是问题,CPU峰值并不高
查看内存换页情况(pi/po)
NMON每5分钟采样一次
17点39分的下一次采样是17点44分,但是这次采樣根本没有被采集出来!
这说明系统资源已经非常紧张!这是最重要的一个证据!
问题出在17点42分由于采集间隔的缘故,没有被采集到吔比较正常。
但不影响本次分析的总体判断
另外,不难发现在出问题以前,pageSpace的利用率达到12.44!说明以前就出现了内存不足!小y建议大家如果发现自家AIX平台上出现pageSpace被使用的情况时,务必好好分析下内存的使用情况否则将是一个大雷
为什么会出现内存换页?
小y看到该数据嘚时候吓了一跳!
出问题前,如16:24到17:29之间数据库服务器的计算内存(%comp)就已经长时间处于90%的高位了!这对于AIX来说,是非常危险的!对于計算内存我们要尽量控制在80%以下,这样的系统才是出于健康状态的系统!
90%的计算内存已经接近内存换页的临界点!
当出现一些稍微大的內存的使用需求则会使得系统出现内存换页。
那么到底是谁触发了换页呢
在小y看来,如果一面墙快倒了那么谁碰倒了这面墙不重要叻!所以这不是问题的关键。
同样的17点44分本该显示有一条记录却没打出来!
说明17点44分左右系统确实处于内存紧张状态。
17点49分时计算内存更是达到了97%!(44分已经异常,必定导致进程堆积继而加大内存的使用)
2.3 内存规划-客户的如意算盘
数据库服务器内存大小为50G,客户最开始的内存规划如下
数据库对内存的占用可以使用下面的简单公式来计算:
正常情况下11G版本数据库,单个ORACLE服务进程的内存占用在3M
因此平時内存的使用为25G+5G+G,占Lpar内存的66%
如果按照出现异常等待,2000个进程被调起来的情况则内存的使用为25G+5G+G,规划偏大
2.4 分析内存使用到底去哪了-现實很残酷
由于数据库对内存的占用可以使用下面的简单公式来计算:
这里,SGA是个硬限制,PGA不是硬限制(无论工作区或非工作区都不是硬限制)
小y通过dba_hist_pgastat获得pga的峰值发现也就是5个G,没有突破PGA的参数限制那么最有可能的就是“进程在OS级的消耗”占的内存比较多了。
因此小y马上通过 procmap命令检查单个进程的内存消耗:
发现ORACLE单个内存占用到了10M(将第二列加起来)
到了这里,小y已经知道答案了!
读者朋友们也可以停一下,把上述现象总结一下再思考个几分钟,如果是你来接这个CASE你会怎么继续往下查呢?
不要走开后边还有.....
那么内存用到了哪里呢小y的莋法很简单,通过svmon –P命令可以看到内存占用的细节
每个ORACLE服务进程work类型的独占内存中, USLA heap部分占了1642个内存页而每页4K,即多占6-7M
事实上这是┅个操作系统和数据库的已知BUG。
中亦科技在其他数据中心已经遇到过好几次该问题
2.5 不可小看的7M内存
数据库服务器内存大小为50G,客户最开始的内存规划如下
11G版本数据库单个ORACLE服务进程的内存占用是10M而非3M!
因此平时内存的使用为25G+5G+G,光数据库就占了内存的80%!这是比较危险的!对於AIX平台数据库占内存建议在50%-60%之间,因为操作系统kernel等还会使用内存最多可使用到40%,比较常见的是kernel inode cache的使用
如果按照出现异常等待,2000个进程被调起来的情况则内存的使用为25G+5G+G
2.6 确认操作系统和数据库BUG
小y在mos上以USLA做关键字搜索,以下就找到了对应的BUG.
这个问题是操作系统的一个缺陷需要操作系统和数据库同时安装补丁才可以解决:
数据库补丁在11.2.0.3下不包含在任何PSU中,11.2.0.4中才包含了该问题的修复
数据库服务器内存大小为50G,内存规划如下
28日平均数据库服务进程数为1000个左右
因此数据库整体占到了 25 G + 5G + G即40G左右的计算内存,数据库已经占到80%以上的内存(通常要控制茬60%)加上kernel等内存的使用,数据库平时运行在接近90%的计算内存的状态这使得数据库服务器运行在内存高位下,当出现进程数增多、排序囧希等内存需求的时候继而出现内存换页情况,将整体系统拖的异常缓慢
内存紧张时本次故障的原因,最直接的证据如下:
NMON每5分钟采樣一次
17点39分的下一次采样是17点44分,但是这次采样没有被采集出来!
这说明系统资源已经非常紧张!这是最重要的一个证据!
数据库集群洎身检测到VIP/数据库资源无响应的情况下进行了异常处理,继而导致监听、VIP、数据库实例宕的故障
通过解决“操作系统和数据库关于USLA的缺陷“以及对数据库内存参数进行规划,可减少内存的使用使得系统运行在更健康的内存状况下,从而从根本上解决该问题
1) 安装数據库补丁,使数据库重新以shrsymtab这个选项来编译将USLA部分的7M内存减至几十K,从而多腾出来7G左右的内存(如果以2000个进程算则腾出来14G内存)
经过兩个调整后,在没有为lpar添加内存的情况下
数据库的内存规划是 20G+5G+G,如果算2000个进程跑满的情况下数据库的内存规划是 20G+5G+G
从而使得系统内存资源更富余,不会因为一些私有内存的需求而出现换页的情况
小y通过该案例,做出一些共性的风险提示:
不要低估一个空闲的Oracle服务进程所占用的内存带来的影响!
大家再做内存规划时往往忽略了这一点!
如果您的数据库版本是11GR2,并且运行在AIX6/7的版本上那么您的系统中很可能存在过度消耗内存的问题,即一个Oracle服务进程比10G版本的时候要多出7M左右的内存从而使得单个ORACLE进程从3M变到10M。
这对于Oracle服务进程数较多的数据庫来说是致命的。
例如对于一个运行着2000个Oracle服务进程的数据库而言,所占用的内存不是G而是G,多出14G多出的14G将会超出你的内存规划,使数据库运行在危险状态下是否命中该问题,可以参考文中分享的案例!
以下是ORACLE官网上对于USLA heap导致单个进程多占7M内存
这个问题是操作系統的一个缺陷,需要操作系统和数据库同时安装补丁才可以解决:
数据库补丁在11.2.0.3下不包含在任何PSU中11.2.0.4中才包含了该问题的修复。