诊断案例:Failed parse elapsed time引发db time过高的案例

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
简介:

这几天遇见一份 awr,发现其 db time 比平时高出 200 倍左右,这个时间段(1个小时左右)的会话量比平时高出一倍,但与之对应的 awr 中 Load Profile 的部分指标如 executes、transactions、redo size 等比平时反而要减少,这引起了我的好奇,于是想探究一下。

972694799af59893ed7f908f7110823240ec5e0f

一、awr分析

下图是高负载时段的 awr

61ee6b327cc43ddd54898c08bae8938d3d02923d

通过上面可以看到 DB Time 2458.93 分钟,平均每秒有 40.98 的 DB Time,也就是说节点1平均活动会话数为 40.98(不包含数据库后台进程会话),对于 cpu 个数为8的服务器来说,DB 占 CPU 资源的 512.25%。

我们在看一段正常时段的 db time(我随便截图的一个,平时的 dbtime 在80到120左右)

fbd711136d6d62d7eeb28fbb829bf4d6eb5ab639

对比 load profile 中的信息

d85a4a9dc84e7de656a790416fd6370a0318757a

通过对比大部分 load profile 指标可以发现正常时段的事务量、解析数、日志、执行频率等比高负载时反而低,这意味着在负载高的时段系统的运行效率在下降,或者说系统的各项运行并没有随着会话(业务量)的增加而增加。

通过 top 5,发现排第一的是 SQL*Net break/reset to client 等待。

469b8ebc20559dcb53363d3f72d766ce13f786b7

当使用 db_link 时,如果应用程序运行发生错误,服务器端本地的服务进程会将该信息告之远程客户端,这个告知的过程中服务进程就处于 SQL*Net break/reset to client 等待中,直到客户端收到问题信息为止,这种一般是由于应用端对 exception 的捕获不充分造成的,可以通过 10046 事件进行捕获。

不过今天想研究的是下面的这个,在这个环境中,它和上面的等待事件是相互呼应的,因为该系统中大量的数据操作都是通过 dblink 实现的;

7b569c74c5b200dd9ed58cd2286d453d89fa7f7c

failed parse elapsed time 意味着当我们的 sql 在进行硬解析的时候,出现了错误。主要产生错误的原因可能包含:SQL 语法错误,对象不存在,没有足够的权限等。我们在查看下高负载时段的 Instance Activity Stats

240c02fac5aa3ff041be017055d2a4793fd6d723

硬解析次数143次,解析失败次数达到了131次,我们在来看一个正常时段的

c1d7c068a61594080c4dea8f8619b2090bb5bb14

我们可以通过 10035 事件来观察解析 sql 失败的操作来发现问题语句,从而完善代码处理逻辑,减少解析失败的几率,从某种程度上讲也会减少 SQL*Net break/reset to client 等待事件。

二、测试环境模拟10035观察解析失败sql

创建测试表;

SQL> create table aa as select * from v$mystat where rownum <6;


Table created.


SQL> desc aa;

Name Null? Type

----------------------------------------- -------- ----------------------------

SID NUMBER

STATISTIC# NUMBER

VALUE NUMBER

开启 10035 事件,并做几笔错误 sql;

SQL> select sdi1 from aa;

select sdi1 from aa

*

ERROR at line 1:

ORA-00904: "SDI1": invalid identifier



SQL> update aa set sid=sysdate where value=0;

update aa set sid=sysdate where value=0

*

ERROR at line 1:

ORA-00932: inconsistent datatypes: expected NUMBER got DATE



SQL> select * from cc;

select * from cc

*

ERROR at line 1:

ORA-00942: table or view does not exist

查看 trace 日志

Fri May 06 05:05:04 2016

PARSE ERROR: ospid=23029, error=904 for statement:

select sdi1 from aa

Additional information: hd=0x861a7168 phd=0x861dfc90 flg=0x20 cisid=0 sid=0 ciuid=0 uid=0

Fri May 06 05:06:10 2016

PARSE ERROR: ospid=23029, error=932 for statement:

update aa set sid=sysdate where value=0

Additional information: hd=0x85132fe8 phd=0x853760b0 flg=0x20 cisid=0 sid=0 ciuid=0 uid=0

Fri May 06 05:06:43 2016

PARSE ERROR: ospid=23029, error=942 for statement:

select * from cc

Additional information: hd=0x852332a0 phd=0x8524d360 flg=0x28 cisid=0 sid=0 ciuid=0 uid=0

通过 10035 事件,可以帮我们发现程序中那些不太完善需改进的 sql 语句;做为临时性解决办法,也可以采用调整 _cursor_features_enabled 隐藏参数的方式,具体调整方式可以查看 mos 文档

How to Identify Hard Parse Failures (文档 ID 1353015.1)

Resolving Issues Where High ‘failed parse elapsed time’ Seen Due to SQL Receiving Errors on Parse/Execute (文档 ID 1476070.1)


原文发布时间为:2018-05-30
本文作者:卢立广
本文来自云栖社区合作伙伴“ 数据和云”,了解相关信息可以关注“ 数据和云”。
相关文章
|
2月前
|
Serverless 应用服务中间件 网络安全
函数计算操作报错合集之如何处理报错 "Function instance health check failed on port 7860 in 120 seconds."
在使用函数计算服务(如阿里云函数计算)时,用户可能会遇到多种错误场景。以下是一些常见的操作报错及其可能的原因和解决方法,包括但不限于:1. 函数部署失败、2. 函数执行超时、3. 资源不足错误、4. 权限与访问错误、5. 依赖问题、6. 网络配置错误、7. 触发器配置错误、8. 日志与监控问题。
|
2月前
|
存储 大数据 数据库
MySQL设计规约问题之为什么要利用pt-query-digest定期分析slow query log并进行优化
MySQL设计规约问题之为什么要利用pt-query-digest定期分析slow query log并进行优化
|
关系型数据库 MySQL
MySQL:自动维护create_time和update_time字段
通过建表语句设置,让mysql自动维护这两个字段,那么编程的时候也能少写一部分代码
80 0
打开My Lead detail page会发生timeout的错误的解决方案
url: https://:4080/sap/opu/odata/sap/CRM_LEAD/Leads(guid’3440B5B1-73AE-1ED5-8281-F76984271084’)?$expand=Products,ChangeDocs,LeadLogs 这个gateway的request会call CRM backend 三次: 第一次触发:
打开My Lead detail page会发生timeout的错误的解决方案
|
SQL 关系型数据库 MySQL
MySQL运行SQL:[ERR] 1231 - Variable ‘time_zone‘ can‘t be set to the value of ‘NULL‘
MySQL运行SQL:[ERR] 1231 - Variable ‘time_zone‘ can‘t be set to the value of ‘NULL‘
2108 0
|
数据库 关系型数据库 Oracle