前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >sqlplus登录缓慢的问题分析过程及解决小记

sqlplus登录缓慢的问题分析过程及解决小记

作者头像
数据和云
发布2021-05-31 15:24:38
1.2K0
发布2021-05-31 15:24:38
举报
文章被收录于专栏:数据和云数据和云

一、问题描述

近日在某客户现场进行巡检,发现有一个系统在进行sqlplus / as sysdba登录的时候特别缓慢。多次测试,最长时间可以达到近10s才能成功登录。此时,对主机的CPU、内存、IO以及网络等参数进行查看,发现使用率均不高,远远没有达到瓶颈,且在登录之前和登录之后,所有操作均非常顺滑,没有任何卡顿。因此,判断该系统就是在sqlplus登录的时候才可能出现卡顿。

由于客户的业务并未反馈使用有问题,所以当时仅将该问题记录到日常错误处理日志中。但是过了几天后,突然客户的业务使用人员说,他们的某功能经常出现连接超时问题。这个时候,我就很肯定业务也受到了sqlplus登录缓慢所带来的影响。于是专门翻出这个问题进行进一步的分析和排查。

二、问题分析过程

在此之前,其实也遇到过很多次sqlplus登录缓慢的问题,而造成该问题的原因就是客户使用了DNS进行IP解析。sqlplus在登录的时候会解析DNS,而在解析这一步耗费的时间较长,从而影响了sqlplus登录过程所消耗的时间。

所以,本次就先入为主,查看是否在服务器环境中存在DNS的配置:

代码语言:javascript
复制
cat /etc/resolv.conf

# Generated by NetworkManager

可以发现,主机上并没有DNS配置,所以造成sqlplus登录缓慢的常见原因也不是这个造成的。

那么,我们则需要进行进一步的原因排查。

首先,我们需要了解到,针对于Oracle数据库的异常排查有一些很有用的方式,比如oradebug、event分析、hanganalyze、strace等等,只有我们选对了异常排查方式,才能够事半功倍。

而对于sqlplus登录缓慢的问题,由于起初不知道是因为数据库原因造成,还是因为命令调用原因造成,所以我们可以考虑选择hanganalyze或者strace的方式进行排查。

针对本次异常,首先对数据库进行了hanganalyze分析,但是分析出的结果并未显示出有阻塞链。所以,问题应该处在sqlplus命令调用原因。此时,我们就可以用strace的方式进行分析了:

代码语言:javascript
复制
strace -T -tt -o /tmp/strace_sqlplus_local.txt sqlplus / as sysdba

通过以上命令,可以生成一个sqlplus命令在执行期间对Linux做了那些调用的文件。通过该文件,我们则可以看到在哪个过程调用比较慢。

通过对生成的文件进行查看分析,发现在以下这一步骤调用时间出现异常:

可以发现此时在该步骤调用的时间有7秒多。

所以,此时我们能确定到问题点在什么地方。但是是什么原因造成的这个地方调用缓慢呢?我们可以看到其中有NTP0的字样,所以当时也怀疑是否与NTP服务有关。

进一步,我对NTP的相关服务进行检查,发现在该服务器上并没有任何NTP的配置,而且NTP服务也都没有开启。

分析到这里,也是有点迷惑了,这一步到底是在做什么?为什么会导致这么慢?此时我也有点无从下手了,还好有公司二线专家,请教了二线专家后,让我在strace中在加入-Fr参数,更近一步的去fork调用的子进程。

代码语言:javascript
复制
strace -T -tt -Fr -o /tmp/strace_sqlplus_local.txt sqlplus / as sysdba

可以看到,在这里有一段mmap()函数的调用耗费的时间比较长,基本上在4s左右(这里可能和上面的时间不匹配,主要是在分析的时候生成了多次的原因)。

而经过查询,发现mmap函数主要是Linux下内存映射到文件的一种方法(具体的该函数的内容和功能,我没有详细研究),因此可以猜测,sqlplus登录缓慢的问题,可能出现在内存映射上。

于是再进一步,对Oracle的内存分配以及相关的内存参数进行查看,最终发现了一个参数:pre_page_sga,该参数在当前环境中设置的为true,而该参数默认为false。

三、问题原因定位

pre_page_sga这个参数有什么作用呢?从官网和其他blog中,查到这个参数的作用如下:

在Oracle实例启动时,只会在物理内存中载入sga的各个内存的最小的大小(以粒度为单位),而剩余的sga只会在虚拟内存中分配。只有当进程touch到相应的page时,才会置换到物理内存中。当参数设置为TRUE时,不仅在实例启动时,需要touch所有的SGA页,并且由于每个Oracle进程都会访问SGA区,所以每当一个新进程启动时(在Dedicated Server方式中,每个会话都会启动一个Oracle进程),都会touch一遍该进程需要访问的所有页。

通过以上描述,我们可以知道如果将改参数设置为true的时候,每次我们进行sqlplus登录的时候,实际上都会生成一个Oracle进程,而此时改进程会touch一遍所有需要访问的内存页。当需要访问的内存页很大的时候,可能就会产生缓慢的情况。

四、问题解决

后来我也建议客户将该参数改为false,在客户修改、重启后进行测试,发现sqlplus登录缓慢问题解决。再次通过strace生成sqlplus的跟踪文件可以发现,此时在NTP0的地方,效率变得非常高了。

五、总结

本次问题是一个常见问题,但不是一个常见原因导致。一个简单的sqlplus登录缓慢问题,造成原因可能很多,从跟踪日志中来看包括DNS、内存、adump日志过多、读取glogin.sql等等。本篇文章的目的,其实更多的是提供了一种遇到类似问题的分析思路,供大家参考。

关于作者

王鑫,云和恩墨西区交付团队技术顾问,从事Oracle DBA工作7年左右,服务客户包含电力、军工、政府、金融等,拥有Oracle OCP、OCM,PGCA、PGCE多项认证,擅长Oracle数据库迁移、异常诊断。

墨天轮原文链接:https://www.modb.pro/db/61912(复制到浏览器或者点击“阅读原文”立即查看)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 二、问题分析过程
  • 四、问题解决
  • 五、总结
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档