一次报警了解: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,一经查实,立即删除!

相关文章

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常见时间复…

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…

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; 作为一种创新的位置编码…

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 来…

基础算法——二维前缀和

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

每日Attention学习19——Convolutional Multi-Focal Attention

每日Attention学习19——Convolutional Multi-Focal Attention 模块出处 [ICLR 25 Submission] [link] UltraLightUNet: Rethinking U-shaped Network with Multi-kernel Lightweight Convolutions for Medical Image Segmentation 模块名称 Convolutional Multi-Focal Atte…

2. K8S集群架构及主机准备

本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

游戏引擎学习第89天

回顾 由于一直没有渲染器&#xff0c;终于决定开始动手做一个渲染器&#xff0c;虽然开始时并不确定该如何进行&#xff0c;但一旦开始做&#xff0c;发现这其实是正确的决定。因此&#xff0c;接下来可能会花一到两周的时间来编写渲染器&#xff0c;甚至可能更长时间&#xf…

链式结构二叉树(递归暴力美学)

文章目录 1. 链式结构二叉树1.1 二叉树创建 2. 前中后序遍历2.1 遍历规则2.2 代码实现图文理解 3. 结点个数以及高度等二叉树结点个数正确做法&#xff1a; 4. 层序遍历5. 判断是否完全二叉树 1. 链式结构二叉树 完成了顺序结构二叉树的代码实现&#xff0c;可以知道其底层结构…

Kubernetes 中 BGP 与二层网络的较量:究竟孰轻孰重?

如果你曾搭建过Kubernetes集群,就会知道网络配置是一个很容易让人深陷其中的领域。在负载均衡器、服务通告和IP管理之间,你要同时应对许多变动的因素。对于许多配置而言,使用二层(L2)网络就完全能满足需求。但边界网关协议(BGP)—— 支撑互联网运行的技术 —— 也逐渐出…

Linux提权--John碰撞密码提权

​John the Ripper​&#xff08;简称 John&#xff09;是一个常用的密码破解工具&#xff0c;可以通过暴力破解、字典攻击、规则攻击等方式&#xff0c;尝试猜解用户密码。密码的弱度是提权攻击中的一个重要因素&#xff0c;如果某个用户的密码非常简单或是默认密码&#xff0…

大数据学习之Spark分布式计算框架RDD、内核进阶

一.RDD 28.RDD_为什么需要RDD 29.RDD_定义 30.RDD_五大特性总述 31.RDD_五大特性1 32.RDD_五大特性2 33.RDD_五大特性3 34.RDD_五大特性4 35.RDD_五大特性5 36.RDD_五大特性总结 37.RDD_创建概述 38.RDD_并行化创建 演示代码&#xff1a; // 获取当前 RDD 的分区数 Since ( …

[创业之路-286]:《产品开发管理-方法.流程.工具 》-1- IPD两个跨职能团队的组织

IPD&#xff08;集成产品开发&#xff09;中的两个重要跨职能组织是IPMT&#xff08;集成产品管理团队&#xff09;和PDT&#xff08;产品开发团队&#xff09;。 在IPD&#xff08;集成产品开发&#xff09;体系中&#xff0c;IRB&#xff08;投资评审委员会&#xff09;、IPM…

DeepSeek 提示词之角色扮演的使用技巧

老六哥的小提示&#xff1a;我们可能不会被AI轻易淘汰&#xff0c;但是会被“会使用AI的人”淘汰。 在DeepSeek的官方提示库中&#xff0c;有“角色扮演&#xff08;自定义人设&#xff09;”的提示词案例。截图如下&#xff1a; 在“角色扮演”的提示词案例中&#xff0c;其实…

第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)

引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码&#xff0c;在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码&#xff0c;进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…

登山第十七梯:矩形拟合——无惧噪声

文章目录 一 摘要 二 资源 三 内容 (文章末尾提供源代码) 一 摘要 目前,获取点集的矩形拟合结果的主要方法是计算其最小外包直立矩形或者旋转矩形。这些方法简单、易用,在数据质量良好的情况下能够较好的贴合矩形形状。然而,在数据缺失时,最小外包围盒方法将会…