首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
function
heap
node.js
io
int
express
ascii
plugins
md5
java
char
python2
vba
dll
nodejs
integer
substring
stream
solr
foreach
runtime
match
perl
tags
request
replace
merge
bitmap
php8
js
testing
shell
web
window
format
dockerfile
httpclient
eval
jar
actionscrip
utf-8
split
settings
chat
text
blob
python3
keyword
select
hashset
process
import
controller
grid
php7
heatmap
byte
subset
post
instance
future
cmd
uml
c语言
less
uri
list
cSharp
rsa
command
random
lua
datetime
header
bytecode
timestamp
spring
search
include
当前位置:
开发笔记
>
编程语言
> 正文
用LGWRWORKER的例子介绍strace分析Oracle数据库行为的方法
作者:因为梦想2013 | 来源:互联网 | 2023-10-17 11:51
可观测性能力是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无阻塞写的想法不一致。二者可能在面对不同场景时各有优势,到底哪种更好也不太好判断,也不在我们今天讨论的范围内。今天我们重点要介绍的是跟踪数据库后台进程行为的方法。
oracle
数据库
运维
日志
开发者
sql
文件
linux
并发
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
io
MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ...
[详细]
蜡笔小新 2024-12-26 13:21:38
js
高效解决应用崩溃问题!友盟新版错误分析工具全面升级
友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ...
[详细]
蜡笔小新 2024-12-26 14:11:47
merge
MySQL索引详解与优化
本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ...
[详细]
蜡笔小新 2024-12-25 19:52:47
js
深入理解领域驱动设计及其实践
本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ...
[详细]
蜡笔小新 2024-12-25 18:45:55
java
新浪笔试题
1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ...
[详细]
蜡笔小新 2024-12-27 19:32:17
io
数据库内核开发入门 | 搭建研发环境的初步指南
本课程将带你从零开始,逐步掌握数据库内核开发的基础知识和实践技能,重点介绍如何搭建OceanBase的开发环境。 ...
[详细]
蜡笔小新 2024-12-27 16:38:48
foreach
MyBatis 动态 SQL 详解与应用
本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ...
[详细]
蜡笔小新 2024-12-27 16:20:10
char
网站与MySQL数据库的连接与交互
本文详细介绍了如何通过多种编程语言(如PHP、JSP)实现网站与MySQL数据库的连接,包括创建数据库、表的基本操作,以及数据的读取和写入方法。 ...
[详细]
蜡笔小新 2024-12-27 14:09:23
java
MyBatis:深入解析与应用
在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ...
[详细]
蜡笔小新 2024-12-27 12:17:16
java
网络攻防实战:从HTTP到HTTPS的演变
本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ...
[详细]
蜡笔小新 2024-12-27 11:34:50
io
MySQL缓存机制深度解析
本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ...
[详细]
蜡笔小新 2024-12-26 15:15:06
java
Hadoop入门与核心组件详解
本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ...
[详细]
蜡笔小新 2024-12-26 13:12:48
int
对MariaDB未来发展的思考与担忧
本文探讨了MariaDB在当前数据库市场中的地位和挑战,分析其可能面临的困境,并提出了对未来发展的几点看法。 ...
[详细]
蜡笔小新 2024-12-25 18:20:32
java
实体映射最强工具类:MapStruct真香
实体映射最强工具类:MapStruct真香 ...
[详细]
蜡笔小新 2024-12-25 16:22:17
java
掌握Java EE的全面指南
探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ...
[详细]
蜡笔小新 2024-12-25 13:38:29
因为梦想2013
这个家伙很懒,什么也没留下!
Tags | 热门标签
function
heap
node.js
io
int
express
ascii
plugins
md5
java
char
python2
vba
dll
nodejs
integer
substring
stream
solr
foreach
runtime
match
perl
tags
request
replace
merge
bitmap
php8
js
RankList | 热门文章
1
HDU 1087题:求最大递增子序列和
2
Waymo计划在美国自动驾驶技术中心匹兹堡设立新办公室
3
18版本新增权限菜单管理功能(第三部分)
4
中医养生八大禁忌,让你健康长寿
5
使用MAT命令行工具进行heapdump分析
6
一些常见的PHP面试题目及解析
7
DB2语句的详细信息和资料
8
出差2天必备物品:电脑是否必需?
9
聊一聊移动web分辨率的重要事项
10
深入探索protobuf协议学习笔记
11
某公司C笔试题 [个人解法]
12
使用和代码示例:org.osgi.service.blueprint.reflect.BeanMetadata.getDependsOn()方法详解与示例展示
13
使用xadmin2,自定义Action和message
14
战舰|甲板_419. 甲板上的战舰(阅读理解)
15
使用粒子群优化算法(PSO)解决旅行商问题(TSP)
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有