中午的时候,我们生产上的某个数据库,cpu一直居高不下

通过例如以下的sql语句,我们查看当时数据库的等待,争用的情况:

select s.SID,
s.SERIAL#,
'kill -9 ' || p.SPID,
s.MACHINE,
s.OSUSER,
s.PROGRAM,
s.USERNAME,
s.last_call_et,
a.SQL_ID,
s.LOGON_TIME,
a.SQL_TEXT,
a.SQL_FULLTEXT,
w.EVENT,
a.DISK_READS,
a.BUFFER_GETS
from v$process p, v$session s, v$sqlarea a, v$session_wait w
where p.ADDR = s.PADDR
and s.SQL_ID = a.sql_id
and s.sid = w.SID
and s.STATUS = 'ACTIVE'
order by s.last_call_et desc;

从event能够看到,是latch 的争用导致的原因

通过假设的sql,查看是什么样的latch

select * from v$session_wait
where event like 'latch free';

P2就是 这个latch的name。通过v$latchname这个视图就能够知道哪个详细的latch

1:45:55 PM SQL> select * from v$latchname where latch#=164;

    LATCH# NAME                                                                   HASH
---------- ---------------------------------------------------------------- ----------
164 simulator hash latch 2233208730

查看latch的历史情况

2:11:59 PM SQL> select name,gets,misses,sleeps from v$latch where sleeps >0 order by sleeps desc;

NAME                                                                   GETS     MISSES     SLEEPS
---------------------------------------------------------------- ---------- ---------- ----------
simulator hash latch 4827860212 135426899 10890947
cache buffers chains 1619822817 2850976006 4747728
gc element 4660052091 25748270 175073
resmgr:schema config 91872524 153968 95708
ges resource hash list 174151449 1070556 55459
Real-time plan statistics latch 40953155 651496 44527
call allocation 3301878 265908 43501
row cache objects 336300485 4970324 19366

这个simulator hash latch已经是显著的latch部分

eagle在他的站点上有篇文章讲到了关于simulator这个

http://www.eygle.com/archives/2011/11/simulator_lru_latch.html

simulator意为模拟。也就是说当Oracle在内存中进行数据块处理时。实际上还会在预先分配的Buffer中进行相关信息记录,如DBA信息,当数据块被老化之后,下次读取时。假设请求的数据在Simulator内存中存在,则觉得继续缓存该数据块是有意义的,通过监控并模拟统计这些操作,并对计算结果加权运算。就能够实现对于内存的调整建议。

在模拟过程中。也是通过Latch来实现的,相关的Latch就有 simulator lru latch 、 simulator hash latch等.

就Buffer Cache而言。假设系统中该类争用严重,则能够考虑关闭db_cache_advice。消除这部分内部操作对于性能的影响。

下面是一个相关BUG。在该Bug中,因为DB_CACHE_ADVICE的开启导致了严重的simulator lru latch的竞争:

Bug 5918642  Heavy latch contention with DB_CACHE_ADVICE on

This note gives a brief overview of bug 5918642. 

 The content was last updated on: 01-APR-2008

 Click 

cs=UTF-8" style="text-decoration:none; color:rgb(0,130,255); outline-width:medium; padding-bottom:0px; padding-top:0px; outline-style:none; padding-left:0px; outline-color:invert; padding-right:0px">here for
details of each of the sections below.

Affects:

Product (Component) Oracle Server (Rdbms)
Range of versions believed to be affected Versions < 11.2
Versions confirmed as being affected
Platforms affected Generic (all / most platforms affected)

Fixed:

This issue is fixed in

Symptoms:

Related To:

Description

High simulator lru latch contention can occur when db_cache_advice is
set to ON if there is a large buffer cache. Workaround:
Set db_cache_advice to OFF

当然,这个仅仅是治标不治本的做法,这个是显现的表象的问题。根源的问题还是这个sql语句有问题

当一个数据块读入到sga中时,该块的块头(buffer header)会放置在一个hash bucket的链表(hash chain)中。该内存结构由一系列cache buffers chains子latch保护(又名hash latch或者cbc latch)。对Buffer cache中的块,要select或者update、insert,delete等。都得先获得cache buffers chains子latch,以保证对chain的排他訪问。

若在过程中发生争用,就会等待latch:cache buffers
chains事件。

产生原因: 1. 低效率的SQL语句(主要体如今逻辑读过高) 在某些环境中,应用程序打开运行同样的低效率SQL语句的多个并发会话。这些SQL语句都设法得到同样的数据集,每次运行都带有高 BUFFER_GETS(逻辑读取)的SQL语句是基本的原因。

相反,较小的逻辑读意味着较少的latch get操作,从而降低锁存器争用并改善性能。注意v$sql中BUFFER_GETS/EXECUTIONS大的语句。 2.Hot block 当多个会话反复訪问一个或多个由同一个子cache buffers chains锁存器保护的块时。热块就会产生。

当多个会话争用cache
buffers chains子锁存器时,就会出现这个等待事件。有时就算调优了SQL,但多个会话同一时候运行此SQL,那怕仅仅是扫描特定少数块,也是也会出现HOT BLOCK的。

SELECT P935.SEQUENCEID,
null FA_SEQUENCEID,
P935.ORDERID,
P935.ORGORDERID,
P935.PRODUCTNAME,
P935.PRODUCTNUM,
P935.ORDERTIME,
P935.LASTUPDATETIME,
P935.ORDERSTATUS,
P935.MEMO,
935 orderCode,
P935.PAYERACCTCODE,
P935.PAYERACCTTYPE,
P935.PAYEEACCTCODE PLATACCTCODE,
P935.PAYEEACCTTYPE PLATACCTTYPE,
P936.PAYEEACCTCODE,
P936.PAYEEACCTTYPE,
EXT935.PAYER_DISPLAYNAME,
EXT935.PAYER_NAME,
EXT935.PAYER_IDC,
EXT935.PAYER_MEMBERTYPE,
EXT936.PAYER_DISPLAYNAME PLAT_DISPLAYNAME,
EXT936.SUBMITNAME PLAT_NAME,
EXT936.PAYER_IDC PLAT_IDC,
EXT936.PAYER_MEMBERTYPE PLAT_MEMBERTYPE,
EXT936.PAYEE_DISPLAYNAME,
EXT936.PAYEE_NAME,
EXT936.PAYEE_IDC,
EXT936.PAYEE_MEMBERTYPE,
P935.PAYEEDISPLAYNAME WEBSITENAME,
CASE
WHEN (SELECT count(*)
FROM PAYMENTORDER P936
WHERE P936.Ordercode = 936
and P936.Orderstatus = 0
AND <span style="color:#ff0000;">P936.Relatedsequenceid = P935.SEQUENCEID</span>) > 0 THEN
0
ELSE
1
END AS SHARINGRESULT,
CASE D935.Dealcode
WHEN 210 then
14
else
D935.DEALTYPE
end PAYMETHOD,
D935.DEALAMOUNT,
G935.EXT1,
G935.Ext2,
G935.PAYERCONTACTTYPE,
G935.PAYERCONTACT,
NVL(D935.PAYEEFEE, 0) PAYEEFEE,
NVL(D935.PAYERFEE, 0) PAYERFEE,
nvl(MS936.PAYEEFEE, 0) PLATFORMFEE,
P935.VERSION
FROM PAYMENTORDER P935,
PAYMENTORDER P936,
DEAL D935,
GATEWAYORDER G935,
MSGATEWAYSHARINGORDER MS936,
PAYMENTORDEREXT EXT935,
PAYMENTORDEREXT EXT936
WHERE P936.ORDERCODE = 936
AND P935.ORDERCODE = 935
AND P936.RELATEDSEQUENCEID = to_char(P935.SEQUENCEID)
AND P935.SEQUENCEID = G935.SEQUENCEID(+)
AND P935.SEQUENCEID = D935.ORDERSEQID(+)
AND P935.SEQUENCEID = EXT935.ORDERSEQID(+)
AND P936.SEQUENCEID = EXT936.ORDERSEQID(+)
AND P936.SEQUENCEID = MS936.SEQUENCEID(+)
AND MS936.SHARINGTYPE = 1
AND P935.SEQUENCEID = :1
UNION
SELECT P938.SEQUENCEID,
P935.SEQUENCEID FA_SEQUENCEID,
P938.ORDERID,
P938.ORGORDERID,
P935.PRODUCTNAME,
P935.PRODUCTNUM,
P938.ORDERTIME,
P938.LASTUPDATETIME,
P938.ORDERSTATUS,
P938.MEMO,
938 orderCode,
P938.PAYERACCTCODE,
P938.PAYERACCTTYPE,
P938.PAYEEACCTCODE PLATACCTCODE,
P938.PAYEEACCTTYPE PLATACCTTYPE,
P938.PAYEEACCTCODE,
P938.PAYEEACCTTYPE,
EXT938.PAYER_DISPLAYNAME,
EXT938.PAYER_NAME,
EXT938.PAYER_IDC,
EXT938.PAYER_MEMBERTYPE,
EXT938.PAYEE_DISPLAYNAME PLAT_DISPLAYNAME,
EXT938.SUBMITNAME PLAT_NAME,
EXT938.PAYEE_IDC PLAT_IDC,
EXT938.PAYEE_MEMBERTYPE PLAT_MEMBERTYPE,
EXT938.PAYEE_DISPLAYNAME,
EXT938.PAYEE_NAME,
EXT938.PAYEE_IDC,
EXT938.PAYEE_MEMBERTYPE,
P935.PAYEEDISPLAYNAME WEBSITENAME,
null SHARINGRESULT,
D938.DEALTYPE PAYMETHOD,
D938.DEALAMOUNT,
G935.EXT1,
G935.Ext2,
G935.PAYERCONTACTTYPE,
G935.PAYERCONTACT,
NVL(D938.PAYEEFEE, 0) PAYEEFEE,
NVL(D938.PAYERFEE, 0) PAYERFEE,
0 PLATFORMFEE,
P935.VERSION
FROM PAYMENTORDER P935,
PAYMENTORDER P938,
DEAL D938,
GATEWAYORDER G935,
PAYMENTORDEREXT EXT938
WHERE P935.ORDERCODE = 935
AND P938.ORDERCODE = 938
AND P938.RELATEDSEQUENCEID = to_char(P935.SEQUENCEID)
AND P935.SEQUENCEID = G935.SEQUENCEID(+)
AND P938.SEQUENCEID = D938.ORDERSEQID(+)
AND P938.SEQUENCEID = EXT938.ORDERSEQID(+)
AND P935.SEQUENCEID = :2

分析上面的sql,上面标红的地方。等号左边是varchar2的数据类型,括号右边是number的数据类型。会导致数据类型的隐式转换,造成极大的性能影响

联系研发。改动了sql语句,问题解决

生产上数据库大量的latch free 导致的CPU资源耗尽的问题的解决的更多相关文章

  1. Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题

    Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题 表更描述: 将mysql数据库中的worktask表添加ishaspic字段. 具体操作:(1)数据库worktask表新添是否有图片字 ...

  2. 解决32位plsql客户端连接不64位Oracle11g上数据库

    一.解决方案 因为本人安装的是64位的Oracle,plsql 是32位的故连接不上.网上有方法能连接. 1. 文件下载 下载PLSQL_Developer地址 http://pan.baidu.co ...

  3. 线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,博文更好效果看原版,转本博文的目的就算是个书签吧,需要时候可以定位原文学习 1.故障现象 客服同事反馈平台系统运行 ...

  4. SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库

    SQL Server数据库账号密码变更后导致vCenter Server无法访问数据库 1.1状况描述: 若SQL Server数据库的账号(这里以sa为例)密码发生了变更,那么连接数据的客户端vCe ...

  5. 记一次线上Java程序导致服务器CPU占用率过高的问题排除过程

    博文转至:http://www.jianshu.com/p/3667157d63bb,转本博文的目的就是需要的时候以防忘记 1.故障现象 客服同事反馈平台系统运行缓慢,网页卡顿严重,多次重启系统后问题 ...

  6. SpringBoot+ShardingSphere彻底解决生产环境数据库字段加解密问题

    前言   互联网行业公司,对于数据库的敏感字段是一定要进行加密的,方案有很多,最直接的比如写个加解密的工具类,然后在每个业务逻辑中手动处理,在稍微有点规模的项目中这种方式显然是不现实的,不仅工作量大而 ...

  7. ORACLE11g下如何利用SQL DEVELOPER连接上数据库

    最近在学习数据库的相关内容,在sqlplus敲了几天命令行窗口后,想尝试一下用sql developer 连接上数据库但一直没有实现.在网上查询了相关资料后现在终于弄好了,就来写下此篇博文与大家分享! ...

  8. sqlserver2014两台不同服务器上数据库同步

    sqlserver2014两台不同服务器上数据库同步   同步了快一个月了,哈哈,因为途中比较麻烦,第一次,遇到烦的地方就停下了,今天终于同步成功了,哈哈,下面我就来介绍一下我实现两台数据库同步的过程 ...

  9. cloudera manager安装hive注意事项,提示连不上数据库,没有user目录权限

    1.提示连不上数据库,password:null 解决方法:拷贝数据库驱动到hive的lib目录,数据库要使用安装hive机器的本地数据库,远程的可能连不上 2.没有/user目录权限 解决方法:因为 ...

随机推荐

  1. 603E

    LCT维护MST+子树信息 看了好长时间题解 editorial 结论:像做最小生成树一样,当每个连通块都是偶数个点就停下来. 每次复杂度mlogm 口胡 首先我们发现奇数个点是不满足每个点度数为奇数 ...

  2. 0420-mysql关键词/错误提示关键词

    操作关键词: 1.show //查看.展示 2.use //选择(库/表) 3.database/s //库/所有库 4.table/s //表/所有表 5.primary key //主键:不可重复 ...

  3. Vue发布过程中遇到坑,以及webpack打包优化

    前言 这段时间,本人自己做了一个vue画面部署到自己的服务器上,发现运行速度慢的的惊人,虽然服务器很渣(本人没什么钱,只能租最差的服务器,主要是给自己学习用的),但是这样开发出来的网站简直不能用,所以 ...

  4. yaml标记语言的简介

    今天遇到yml这个文件,挺懵的.也是百度了一把. 这篇博文不错:http://www.ibm.com/developerworks/cn/xml/x-1103linrr/ 这图画得不错:http:// ...

  5. 5.30获取openid和createTime--mybatis自动生成接口和映射【这里需要自定义】

    自定义sql获取数据:        dao:            前提是反向成了代码:                A : 接口PhoneModelMapper extends IBaseMap ...

  6. 2星|《工业X.0》:物联网的资料汇编

    工业X.0:实现工业领域数字价值 看完比较失望,没有看到新的观点想法.基本算是物联网的资料汇编.总体评价2星. 以下是书中一些内容的摘抄: 1:例如,埃森哲为其员工开发了一个用例,用增强现实技术解决实 ...

  7. 分布式机器学习框架:CXXNet

    caffe是很优秀的dl平台.影响了后面很多相关框架.        cxxnet借鉴了很多caffe的思想.相比之下,cxxnet在实现上更加干净,例如依赖很少,通过mshadow的模板化使得gpu ...

  8. ubuntu 16.04 安装QT问题

    使用 sudo  sh ./**.run  有错误: 增加 文件的可运行权限: sudo chmod +x Qt.run 直接运行: ./Qt.run 可完成安装

  9. HTML DIV中文字自动换行 , 顶部对齐

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <meta ht ...

  10. Linux 之根目录介绍

    1. /bin binary二进制 存放系统许多可执行程序文件 执行的相关指令,例如ls pwd whoami,后台的支持文件目录 2. /sbin super binary超级的二进制 存放系统许多 ...