热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用LGWRWORKER的例子介绍strace分析Oracle数据库行为的方法

可观测性能力是IT运维的强有力的支撑。日志告警、指标是两种在运维中很常用的可观测性指标。

可观测性能力是IT运维的强有力的支撑。日志告警、指标是两种在运维中很常用的可观测性指标。而对于数据库这样复杂的IT组件来说,有时候仅仅依靠日志和指标还是不够的。
跟踪是解决数据库复杂问题的十分常用和有效的方法。今年的openGauss 开发者大会上,华为的黄凯耀分享的案例就是使用了eBPF进行跟踪,最终精准定位了一个比较复杂的性能问题。在跟踪方面,国产数据库与Oracle等传统商用国数据库还有这很大的技术差距。做好跟踪并不容易,让运维人员或者售后服务人员能够很方便的跟踪数据库的某种运行行为可以帮助提升运维,加快BUG定位。只不过加入跟踪后的数据库运行可能会变得不稳定或者触发一些非预期的行为和BUG,因此目前为止,除了Oracle体系化的发布了EVENT接口,让运维人员可以自行通过EVENT设置来改变数据库运行行为,或者监视数据库的内部运行,其他数据库还必须依赖一些外部的跟踪工具,使用起来并不方便。
Oracle提供了十分强大的分析功能,特别是EVENT设置。我刚刚开始学习Oracle不久,就学会了使用event 10046去跟踪SQL语句的执行。这对于我刚刚开始接触Oracle这个黑匣子的说话帮助巨大。在缺乏必要的资料,甚至连一个METALINK账号都没有的时期,学习Oracle数据字典的基本原理,以及数据库启动时的主要动作等,都是通过10046 trace文件完成的。后来也经常使用10046/10053等事件分析,来解决用户的SQL语句性能问题。后来我学习一些Oracle新特性的说话,还是经常会使用event做一些trace。
前两天研究了一下Oracle的LGWR worker新机制,我后来也问了一些客户,在一些系统规模不是很大的场景,好像客户都没有感受到这个新的变化。也有写负载较大的用户遇到了LOG FILE SYNC延时过高的问题,后来通过将LGWR改为原来的写模式解决了问题。于是我昨天写了一篇相关的文章,猜测了一下Oracle实现这个功能的原理。当天下午和一个朋友聊起这个事情,他希望我能够进一步确认一下我的猜测是否靠谱。在网上能够找到的资料极少,于是我只能再次使用起5、6年没用过的跟踪大法来做一个分析。
分析Oracle数据库的后台进程功能有一种十分常用的方法,这个是我从Poder大师那边学来的。结合10046和LINUX的strace,可以比较清晰的分析Oracle后台进程的一些行为。因为10046中会输出某个会话执行过的SQL语句,产生过的各种等待事件,利用这个TRACE上的时间戳,结合strace对于调用堆栈的跟踪,就很容易进行问题定位了。这个方法归纳起来很简单:首先对需要跟踪的后台进程设置8级的10046 TRACE,然后开启压测脚本,同事启用strace对调用堆栈进行跟踪就可以了。我们来看看这个完整的过程。
首先我们找到要跟踪的进程,我们准备跟踪lgwr和lg00。然后分别针对这两个进程设置10046 trace。
在两个窗口中分别通过oradebug设置好之后。我们就可以启用一个压测工具slob去产生一些写负载了。为了减少跟踪的日志量,我们把slob设置为1个进程,并且只启动一个并发。
启动好压测负载后,我们就可以分别在两个窗口中对lgwr/lg00进行strace跟踪了:
对于strace不太熟悉的朋友我可以解释一下,-T -tt是在每个调用前显示时间戳,-s是对于每个调用的数据,最多显示512字节。-p -o我就不解释了,估计地球人都明白。跑上几十秒钟后,我们就可以停止跟踪了,因为大部分的行为都十分类似,没必要跑太久。

我们先来看看lg00的strace跟踪信息,因为我加上了-s参数,因此在trace里可以看到所有写入lg00 trace文件的数据的前面512字节。因此我不需要去查看orcl1_lg00_15626.trc文件了。
上面这段trace的开始是lg00完成了一个日志写入的工作,进入Idle等待状态。随后就收到了写任务,开始写入REDO文件,大家注意看因为使用了异步IO,因此lg00通过io_submit来提交IO。我们往下看,可以发现lg00随后发生了ASM IO for non-blocking poll等待,这是因为向ASM发出了IO。然后lg00产生了我们熟悉的log file parallel write等待。到收到io_getevents为止,异步写完成。于是lg00记录了log file parallel write等待完成。
从日志中我们可以梳理出一个大致的脉络。可以看出在Oracle等待事件的统计时长与实际情况并不完全一致。事实上数据库也没必要十分精确的统计等待时长,只要是一个大致的就足够了。只要误差都是差不多的,对于实际分析来说并没有太大的问题。

我们再来看看lgwr的相关时段的跟踪信息。为了方便查看,我梳理了一个表格,从中可以看出整个过程。
我们先来看lgwr,收到写请求后,找到了一个空闲的worker,然后发出写任务。同时发现所有的worker都处于忙的状态。此时正好没有写任务,于是发出一个本地IPC消息,等待ipc消息回复。
而lg00收到写任务后,首先异步提交了IO,然后产生了一系列预期的写日志的等待。完成后先通知lgwr,然后再给等待着发通知。这个算法是比较合理的,由lg00直接发消息给log file sync等待的会话,而不是通过lgwr,这样会有更高的效率。和我由lgwr发消息,lgwr worker无阻塞写的想法不一致。二者可能在面对不同场景时各有优势,到底哪种更好也不太好判断,也不在我们今天讨论的范围内。今天我们重点要介绍的是跟踪数据库后台进程行为的方法。

推荐阅读
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
author-avatar
因为梦想2013
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有