首页
技术博客
PHP教程
数据库技术
前端开发
HTML5
Nginx
php论坛
新用户注册
|
会员登录
PHP教程
技术博客
编程问答
PNG素材
编程语言
前端技术
Android
PHP教程
HTML5教程
数据库
Linux技术
Nginx技术
PHP安全
WebSerer
职场攻略
JavaScript
开放平台
业界资讯
大话程序猿
登录
极速注册
取消
热门标签 | HotTags
get
function
instance
integer
php
jsp
python
shell
uri
hashset
bit
join
byte
format
grid
replace
bash
iostream
spring
lua
stream
httpclient
char
cmd
web
dockerfile
email
tags
c语言
ip
erlang
netty
rsa
hashcode
regex
go
cPlusPlus
io
eval
actionscrip
httprequest
case
node.js
nodejs
audio
range
post
bytecode
metadata
buffer
window
request
usb
less
search
random
golang
web3
int
triggers
filter
chat
timestamp
header
export
keyword
const
input
future
select
bitmap
jar
javascript
callback
datetime
substring
hashtable
include
copy
当前位置:
开发笔记
>
编程语言
> 正文
用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
并发
写下你的评论吧 !
吐个槽吧,看都看了
会员登录
|
用户注册
推荐阅读
ip
Linux负载均衡LVS(IPVS)
一、LVS简介LVS是LinuxVirtualServer的简称,也就是Linux虚拟服务器,是一个由章文嵩博士发起的自由软件项目,现在已经是Linux ...
[详细]
蜡笔小新 2024-09-29 19:25:58
ip
简明实用:Redis 高级特性与案例介绍
本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。Redis基础类型回顾StringRedis中最基本,也是最简单的数据类 ...
[详细]
蜡笔小新 2024-10-08 15:28:15
ip
Linux程序调试利器strace
调用strace [-dffhiqrtttTvxx][-acolumn][-eexpr] [-ofile][-ppid] [-sstrsize][-uusernam ...
[详细]
蜡笔小新 2024-10-08 12:43:25
ip
/etc路径下有些什么?
etc杂七杂八的配置文件etc不是什么缩写,是andsoon(等等)的意思来源于法语的etcetera翻译成中文就是等等的意思.至于为什么在etc下面存放配置文件& ...
[详细]
蜡笔小新 2024-09-30 20:08:11
ip
异构服务器 微服务_微服务架构的核心要点和实现原理
摘要:本文中,我们将进一步理解微服务架构的核心要点和实现原理,为读者的实践提供微服务的设计模式,以期让微服务在读者正在工作的 ...
[详细]
蜡笔小新 2024-09-30 14:35:15
ip
mysql的初次使用,设置密码
启动mysql服务后,打开命令行,可任意目录1mysql-uroot-p不用密码登录进去Ini文件mysqld下面添加skip-grant-tables2usemys ...
[详细]
蜡笔小新 2024-10-08 15:52:42
ip
cobalt strike安装使用教程_Windows10下Docker的安装及使用教程
转自:掘金前端时间公司所有开发同事把虚拟机vagrant安装的开发环境换成了docker的,感觉确实很好用,现在就来介绍下docker的安 ...
[详细]
蜡笔小新 2024-10-08 13:56:02
ip
盘点 DAO 的 15 种类型:如何重塑世界?
世界上的各种组织因为DAO的兴起而开始发生转变。原文标题:《DAO重塑世界的15种方式》 ...
[详细]
蜡笔小新 2024-10-08 11:36:13
ip
crossorigin注解添加了解决不了跨域问题_CORS与@CrossOrigin详解
1、跨域的基本概念a、跨域的解释要了解跨域,首先需要知晓浏览器的同源策略,简单的说就是两个请求协议、端口、主机都相同,则两个请求具有相同的 ...
[详细]
蜡笔小新 2024-09-30 19:24:12
ip
【转】JNI技术实践小结
JNI技术实践小结转自http:sett ...
[详细]
蜡笔小新 2024-09-30 17:47:13
python
python基础(二、pycharm安装、卸载)
3.在Ubuntu中安装PyCharmPyCharm的官方网站地址是:https:www.jetbrains.compycharm注意:安装时不要使用root用户安装,否则后期使用 ...
[详细]
蜡笔小新 2024-09-30 13:43:10
ip
CloudStack 4.0 + KVM 安装详细指南
nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ...
[详细]
蜡笔小新 2024-09-30 12:48:34
ip
linux filesystem_如何使用cgdb + qemu调试linux内核模块
如何使用cgdbqemu调试linux内核模块前言Linux代码庞大而繁杂,光看代码会使人头晕目眩,如果能通过调试工具对其代码执行流程进行调试ÿ ...
[详细]
蜡笔小新 2024-09-30 11:42:29
ip
mongodb复制集部署文档
mongodb复制集部署文档 ...
[详细]
蜡笔小新 2024-09-30 09:07:42
php
lazarus使用sqlite3遇到特定字符时出现乱码的Bug
lazarus使用zeosDB控件时发现SQLite一个奇怪的现象,应用程序编译为win64时,如果输入中国2022中国时出现乱码,win32和linux64正常,开始怀疑的sql ...
[详细]
蜡笔小新 2024-09-29 19:28:45
因为梦想2013
这个家伙很懒,什么也没留下!
Tags | 热门标签
get
function
instance
integer
php
jsp
python
shell
uri
hashset
bit
join
byte
format
grid
replace
bash
iostream
spring
lua
stream
httpclient
char
cmd
web
dockerfile
email
tags
c语言
ip
RankList | 热门文章
1
01背包问题 总结关于为什么01背包优化成1维数组后,内层循环是逆序的?
2
黑客技术入门秒修改Win7开机密码
3
包装机器人成行业给力助手
4
jquery.validate.min.js使用介绍
5
微信遮罩php,微信小程序 遮罩功能实现
6
怎么把自己的项目托管到github
7
两种方法实现在HTML页面加载完毕后运行JS
8
C# | Int64。ToString 方法|设置–1
9
HDU 3486 RMQ+二分
10
转 程序员思维
11
在线mp3音频剪辑器免费版,都有这些软件可以使用
12
DLink 816A2 路由器研究分享
13
Attention is not not explanation
14
[CF442C] Artem and Array (贪心+单调栈优化)
15
PAT1073 Scientific Notation
PHP1.CN | 中国最专业的PHP中文社区 |
DevBox开发工具箱
|
json解析格式化
|
PHP资讯
|
PHP教程
|
数据库技术
|
服务器技术
|
前端开发技术
|
PHP框架
|
开发工具
|
在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved |
京公网安备 11010802041100号
|
京ICP备19059560号-4
| PHP1.CN 第一PHP社区 版权所有