我们在进行 Oracle 故障调试和内核原理工作的时候,经常需要了解后台运行的动作和细节。一些故障场景,如 ORACLE 后台进展慢、程序无法启动、无法登陆、相同环境执行结果却大不相同等问题,就需要操作系统级别监控,检查定位问题。
Oracle 自身已经提供了很多这类型的工具,如 oradebug、各种等待事件和跟踪方式。此外,各类型的操作系统提供出很多系统级别工具,帮助我们进行监控。
我们先来看一个简单的示例:
LGWR 进程写 online redo log 是否用到缓存?这里的这个缓存不是指数据库缓存,操作系统的文件缓存,如果对这个问题不明白,我们先看另外一个问题,我们如果怀疑存储有问题,经常会使用 DD 命令对磁盘进行测试,相关命令如下所示,那这个命令对磁盘的操作是直接写磁盘还是把数据写到文件缓存里去?
我们来实地进行测试验证看一下,这是在我电脑虚拟机上的一个测试结果,DD 了 2G 的文件,花了 4.99 秒的时间,实际上这个命令结束的时候数据没真正写到磁盘上去,对于磁盘的写到缓存就返回了。我们另外看一条命令
这里加了一个标志,就是 ofag=sync,加完这个标示之后,我们发现写磁盘的速度下降了,写 2G 的文件花了 8 秒,多用了 60% 的时间。这就是文件系统缓存的作用,文件系统缓存大大增加了主机的性能。
我们现在回到之前那个问题,LGWR 进程写 redo log 会不会用到缓存呢?我们使用 strace –p 命令来跟踪 LGWR 进程,为方便观察我们添加一组新的 redo 日志组并进行切换。
通过分析 TRACE 信息我们发现,LGWR 进程对 online redo log 打开使用了 o_sync 标示,该标示表示直接写入存储设备。
TRUSS/TUSC/STRACE 是什么?
下面我引用一下 TRUSS 的官方解释,TUSC 与 STRACE 工具功能基本一样。
它是一个在系统层处理复杂问题非常有用的工具,用来跟踪一个进程的系统调用或者信号产生的情况。适用于不同的系统环境。
它们适用于不同的 Unix 环境:
Truss 常用参数介绍
Tusc 常用参数介绍
Strace 常用参数介绍
下面我们看两个简单的使用示例:
首先是使用 strace –tt date 来跟踪 date 命令,使用 - tt 参数在每一行的行头上加上时间信息,到微秒级别。
另外一个示例就是使用 strace –d cate 命令统计所有函数调用的次数及总时间占用,这个对于命令跟踪的分析统计非常有用。
接下来我们来看一个案例,这个案例是一个 SQLPLUS 连接慢的问题,AIX 7.1 的操作系统,11.2.0.3 两节点 RAC 数据库,检查硬件的安装环境没有问题,重新配置环境变量也不能解决问题。
对于这种问题,我们首先要进行一些排查,排除一些可能性:1、我们看一下使用 sqlplus/ as sysdba 慢不慢,经过反馈,sqlplus / as sysdba 也慢,连接时间要 5 秒左右。
2、远程连接慢不慢?
以上判断表明这个连接慢并非一定和 Listener 有关,同时也可以排除网络问题引起的监听连接慢,所以先需要解决 sqlplus / as sysdba 慢的问题,很大可能在 ORACLE 数据库的连接处理机制上面。
我们使用 TRUSS 命令去跟踪跟踪 sqlplus / as sysdba 连接命令,发现不断出现 sigpromask、_sigaction 及 thread_setmystate 函数调用。
那这些函数代表什么?
之后对这些函数进行分析,其主要功能如下:
We see in that truss that main reason weare waiting is that the forked thread is looping on some signal handlingmodification :
They impact the way memory isconfigured (read/write protected, guard pages...)
通过上述分析发现,连接的时候慢与内存页的分配有关,通过进一步检查内存参数发现,pre_page_sga 设置为 true。接下来通过测试可以重现这个问题,实际验证的确如此:设置为 true,问题重现,设置为 false,问题消失,并且发现这个参数为 True 的情况下,SGA 内存越大连接变慢的越明显。
这种行为正常吗?
通过查询 MOS 文档 Notes 289585.1,我们了解知这个行为是正常。
来源: https://yq.aliyun.com/articles/328511