一次报警了解:direct path read、enq: KO - fast object checkpoint

背景

  今天突然接到订单超时报警,数据库的状态确实惊出一身冷汗,查看系统日志正常,数据库日志正常,load 1-3之间,Session 连接200左右,未发现有负载。于是生成一个ASH报告,感觉比平时要慢很多,不过好在报告生成完成。

  • 生产ASH报告时alert日志输出
Tue Jan 14 11:49:26 2025
Active Session History (ASH) performed an emergency flush. This may mean that ASH is undersized. If emergency flushes are a recurring issue, you may consider increasing ASH size by setting the value of _ASH_SIZE to a sufficiently large value. Currently, ASH size is 50331648 bytes. Both ASH size and the total number of emergency flushes since instance startup can be monitored by running the following query:select total_size,awr_flush_emergency_count from v$ash_info; 

ASH报告分析

  • 奇怪的等待事件:direct path read、reliable message、enq: KO - fast object checkpoint

    image.png

“direct path read”与“enq: KO - fast object checkpoint”之间联系

  当进行TABLE FULL SCAN (全表扫描) 或并行查询整个segment时, 11g(由于11g的 Searial Table Scan 新特性)下,因_adaptive_direct_read 默认为true, 达到阀值_small_table_threshold大小的表会被认为是大表,读取数据时不会读入SGA , 而是直接路径读取(direct path read),而direct path read 是需要将数据从磁盘读取到各session 的PGA中,因为不是读入SGA, 所以读取这些表之前需要在所有数据库节点(如果是RAC)触发object level checkpoint,将这些表被修改过的dirty buffer写入磁盘,以保证读取数据的一致性 。

  • 涉及隐含参数
SQL> col KSPPINM for a50 
SQL> col KSPPSTVL for a100
SQL> select ksppinm, ksppstvl from x$ksppi pi, x$ksppcv cv   where cv.indx = pi.indx and pi.ksppinm like '_adaptive_direct_read';
KSPPINM                                            KSPPSTVL
-------------------------------------------------- -----------------------------------------------
_adaptive_direct_read                              TRUESQL> select ksppinm, ksppstvl from x$ksppi pi, x$ksppcv cv   where cv.indx = pi.indx and pi.ksppinm like '_small_table_threshold';KSPPINM                                            KSPPSTVL
-------------------------------------------------- -----------------------------------------------
_small_table_threshold                             74400  --> 单位为blocks
Reliable Message
  • MOS 上对于reliable message的解释如下:<Document 1951729.1.pdf>
    When a process sends a message using the ‘KSR’ intra-instance broadcast service,the message publisher waits on this wait-event until all subscribers have consumed the ‘reliable message’ just sent. The publisher waits on this wait-event for up to one second and then re-tests if all subscribers have consumed the message, or until posted. If the message is not fully consumed the wait recurs,repeating until either the message is consumed or until the waiter is interrupted.

  • 译:
    当进程使用“KSR”实例内广播服务发送消息时,消息发布者会等待此等待事件,直到所有订阅者都使用了刚刚发送的“可靠消息”。发布者等待此等待事件长达一秒钟,然后重新测试是否所有订阅者都已使用该消息,或者直到发布为止。如果消息未被完全消耗,等待会再次出现,重复直到消息被消耗或服务员被打断。

  此等待事件是一个非空闲等待事件,用于跟踪Oracle数据库中的许多不同类型的通道通信,当这个等待出现时,一定意味着某些进程的通道通讯受到阻塞。当然影响主要是进程级别的,不是全局影响。
  是针对各种channel的,不同的channel 处理方式不一。gv$channel_waits 视图里查询问题最严重的 channel,可以看到“kxfp control signal channel  ”遥遥领先其他CHANNEL。

SELECT CHANNEL, SUM(wait_count) sum_wait_countFROM GV$CHANNEL_WAITSGROUP BY CHANNELORDER BY SUM(wait_count) DESC;
引发事件全表扫描的SQL:

image.png

  • 查看执行计划
SQL> select * from  table(dbms_xplan.display_awr('f9h1zk5z96gqv')) ; PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------------------------
SQL_ID f9h1zk5z96gqv
--------------------
...隐藏SQL
Plan hash value: 312768246
---------------------------------------------------------------------------------------------------------------------
| Id  | Operation                    | Name                 | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
--------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT             |                      |       |       |   337K(100)|          |       |       |
|   1 |  NESTED LOOPS OUTER          |                      |     1 |   135 |   337K  (1)| 01:07:26 |       |       |
|   2 |   PARTITION RANGE ALL        |                      |     1 |    83 |   337K  (1)| 01:07:26 |     1 |1048575|
|   3 |    PARTITION HASH ALL        |                      |     1 |    83 |   337K  (1)| 01:07:26 |     1 |    32 |
|   4 |     TABLE ACCESS FULL        | ORDER_*******        |     1 |    83 |   337K  (1)| 01:07:26 |     1 |1048575|
|   5 |   TABLE ACCESS BY INDEX ROWID| ************_INFO    |     1 |    52 |     1   (0)| 00:00:01 |       |       |
|   6 |    INDEX UNIQUE SCAN         | PK_*********         |     1 |       |     0   (0)|          |       |       |
--------------------------------------------------------------------------------------------------
21 rows selected.
  • 表大小 BLOCKS:1264937 > 74400,全表扫描肯定是:“direct path read”
SQL> select table_name,blocks from user_tables  where table_name ='ORDER_*******';
TABLE_NAME                         BLOCKS
------------------------------ ----------
ORDER_*******                     1264937

总结

  经与开发人员确认,是因为有客户批量处理订单导致性能SQL:“f9h1zk5z96gqv”的全表扫描20G的并发量过大,从而导致等待事件直接路径读取(direct path read),而direct path read 是需要将数据从磁盘读取到各session 的PGA中,因为不是读入SGA, 所以读取这些表之前需要在所有数据库节点(如果是RAC)触发object level checkpoint,将这些表被修改过的dirty buffer写入磁盘,以保证读取数据的一致性。
  等待checkpoint完成。相当于 ckpt 或 dbwr 阻塞了读(读入到SGA)。这时,enq: KO - fast object checkpoint 等待事件发生。 如果发生这种等待事件,一个简单的查询可能也会变得非常慢。

  • 解决方案,对该表的查询条件加索引优化。

----- 经验在于多沉淀

欢迎赞赏支持或留言指正

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/69225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19C RAC在vmware虚拟机环境下的安装

RAC安装规划 ===IP== ORA19C01 public ip : 192.168.229.191 heatbeat : 192.168.0.1 vip : 192.168.229.193 ORA19C02 public ip :192.168.229.192 heatbeat : 192.168.0.2 vip : 192.168.229.194 scan ip 192.168.229.195 hosts: echo "192.168.229…

【ABB阀门定位器EDP300如何进行自整定】

ABB阀门定位器EDP300如何进行自整定 自整定前准备 检查安装与连接 确保阀门和定位器安装正确&#xff0c;机械连接牢固&#xff0c;无卡阻或松动。 确认气源压力符合要求&#xff08;通常为1.4~7 bar&#xff09;&#xff0c;气路无泄漏。 确保4~20mA输入信号稳定且接线正确。…

Flink2支持提交StreamGraph到Flink集群

最近研究Flink源码的时候&#xff0c;发现Flink已经支持提交StreamGraph到集群了&#xff0c;替换掉了原来的提交JobGraph。 新增ExecutionPlan接口&#xff0c;将JobGraph和StreamGraph作为实现。 Flink集群Dispatcher也进行了修改&#xff0c;从JobGraph改成了接口Executio…

数据结构(1)——算法时间复杂度与空间复杂度

目录 前言 一、算法 1.1算法是什么&#xff1f; 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…

网络HTTP详细讲解

学习目标 什么是HTTPHTTP的请求和响应常见的HTTP状态码HTTP的安全性 什么是HTTP&#xff1f;HTTP的请求和响应&#xff0c;常见的HTTP状态码&#xff0c;HTTP的安全性 什么是HTTP HTTP&#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用…

Oracle 的归档日志文件(Archive log files)

-- 4.Oracle 的归档日志文件(Archive log files) /************************************************************************************************************************************************************* -- 1. RMAN 备份,开启archivelog后,log过多过大造成造…

spring aop失效场景

aop基于代理&#xff08;jdk动态代理 / cglib代理&#xff09;实现&#xff0c;即new了新的类实例&#xff0c;代理了原来的定义的类实例。 目录 1. final修饰的方法无法被代理2. 静态方法无法被代理3. 内部方法调用&#xff0c;即this.method()无法被代理4. 私有方法不能代理5…

Page Assist - 本地Deepseek模型 Web UI 的安装和使用

Page Assist Page Assist是一个开源的Chrome扩展程序&#xff0c;为本地AI模型提供一个直观的交互界面。通过它可以在任何网页上打开侧边栏或Web UI&#xff0c;与自己的AI模型进行对话&#xff0c;获取智能辅助。这种设计不仅方便了用户随时调用AI的能力&#xff0c;还保护了…

GRN前沿:STGRNS:一种基于transformer的可解释方法,用于从单细胞转录组数据推断基因调控网络

1.论文原名&#xff1a;STGRNS: an interpretable transformer-based method for inferring gene regulatory networks from single-cell transcriptomic data 2.发表日期&#xff1a;2023.4.2 摘要&#xff1a; 动机&#xff1a;单细胞RNA测序&#xff08;scRNA-seq&#xf…

vite共享配置之---css相关

vite和webpack都有对样式的处理&#xff0c;涉及到的有css、sass、scss、postcss、模块化&#xff0c;以下是vite和webpack对样式的处理方式 特性ViteWebpackCSS 处理方式自动处理&#xff0c;无需配置&#xff0c;使用浏览器的原生支持需要配置 style-loader 和 css-loader&a…

OpenAI 实战进阶教程 - 第四节: 结合 Web 服务:构建 Flask API 网关

目标 学习将 OpenAI 接入 Web 应用&#xff0c;构建交互式 API 网关理解 Flask 框架的基本用法实现 GPT 模型的 API 集成并返回结果 内容与实操 一、环境准备 安装必要依赖&#xff1a; 打开终端或命令行&#xff0c;执行以下命令安装 Flask 和 OpenAI SDK&#xff1a; pip i…

深入浅出:旋转变位编码(RoPE)在现代大语言模型中的应用

在现代大语言模型&#xff08;LLMs&#xff09;中&#xff0c;位置编码是一个至关重要的组件。无论是 Meta 的 LLaMA 还是 Google 的 PaLM&#xff0c;这些模型都依赖于位置编码来捕捉序列中元素的顺序信息。而旋转变位编码&#xff08;RoPE&#xff09; 作为一种创新的位置编码…

MATLAB中matches函数用法

目录 语法 说明 示例 匹配文本 使用模式匹配十六进制数 匹配多个字符串 忽略大小写 matches函数的功能是确定模式是否与字符串匹配。 语法 TF matches(str,pat) TF matches(str,pat,IgnoreCasetrue) 说明 TF matches(str,pat) 会在指定模式与 str 有匹配时返回 1…

【信息系统项目管理师】第20章:高级项目管理 详解

更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 20.1 项目集管理20.2 项目组合管理20.3 组织级项目管理20.4 量化项目管理20.5 项目管理实践模型本章是将第三版的第20章、第21章、第18章、第25章、第2章的PRINCE2进行了合并,包括项目集管理、项目组合管理、组…

个人笔记---关于详解threadlocal 上下文环境存储的最佳数据类型

个人原因很久没有写代码,对于一些基础的数据类型有一些忘记,可以根据gpt和我当时的问答进行复习 关于拦截器,由于在请求的到达controller处理器之前,拦截器(当然过滤器也可以实现,我感觉都差不多)就把上下文设置在了线程副本中,那么这个请求到处理器的这些代码进行查询出来的上…

vue3 的 onScopeDispose 是什么作用

onScopeDispose 是 Vue 3 中用于管理响应式副作用的一个重要 API&#xff0c;主要用于在当前活跃的 effect 作用域上注册一个处理回调函数。当这个作用域停止时&#xff0c;所注册的回调函数会被调用。这种机制使得开发者能够有效地清理和管理资源&#xff0c;尤其是在组合式函…

DeepSeek 部署过程中的问题

文章目录 DeepSeek 部署过程中的问题一、部署扩展&#xff1a;docker 部署 DS1.1 部署1.2 可视化 二、问题三、GPU 设置3.1 ollama GPU 的支持情况3.2 更新 GPU 驱动3.3 安装 cuda3.4 下载 cuDNN3.5 配置环境变量 四、测试 DeepSeek 部署过程中的问题 Windows 中 利用 ollama 来…

医疗信息分析与知识图谱系统设计方案

医疗信息分析与知识图谱系统设计方案 0. 系统需求 0.1 项目背景 本系统旨在通过整合医疗机构现有的信息系统数据&#xff0c;结合向量数据库、图数据库和开源AI模型&#xff0c;实现医疗数据的深度分析、疾病预测和医疗知识图谱构建&#xff0c;为医疗决策提供智能化支持。 …

QImage与AVFrame互转

未验证&#xff0c;仅供参考&#xff0c;此方法感觉不是很好 先是AVFrame转QImage #pragma execution_character_set("utf-8")static int decode_write_frame(AVCodecContext *avctx, AVFrame *frame, int *frame_count, AVPacket *pkt, int last) {int len, got_f…

基础算法——二维前缀和

二维前缀和 我们先前已经了解了前缀和思想&#xff0c;二维前缀和感觉上就是一维前缀和的进阶&#xff0c;下面 &#xff0c;我们剖析一下两种前缀和。 一维前缀和 一维前缀和的核心就是这两个公式&#xff0c;二维前缀和也差不多的嘞 下面我们来推理一下二维前缀和 已知&a…