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

系统 Linux
近日在某客户现场进行巡检,发现有一个系统在进行sqlplus / as sysdba登录的时候特别缓慢。多次测试,最长时间可以达到近10s才能成功登录。

[[398590]]

本文转载自微信公众号「数据和云」,作者王鑫。转载本文请联系数据和云公众号。

 一、问题描述

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

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

二、问题分析过程

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

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

  1. cat /etc/resolv.conf 
  2.  
  3. # Generated by NetworkManager 

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

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

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

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

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

strace -T -tt -o /tmp/strace_sqlplus_local.txt sqlplus / as sysdba

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

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

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

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

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

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

  1. 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数据库迁移、异常诊断。

 

责任编辑:武晓燕 来源: 数据和云
相关推荐

2012-08-08 14:33:32

IBMdW

2017-03-27 10:48:03

Hive map优化分析

2016-12-12 12:55:24

模块分析解决

2022-05-12 08:22:54

内核oopsPC

2018-10-23 10:00:21

Windows 10WindowsSSD缓慢

2009-06-14 21:18:02

Java编程汉字问题

2011-08-18 18:46:24

SQL Server

2011-08-24 17:41:16

MySQL死锁

2016-10-20 15:27:18

MySQLredo死锁

2010-07-13 15:17:13

IPX协议

2017-06-14 22:11:57

数据库MySQL死锁

2010-04-02 14:16:10

Oracle SQL

2011-04-29 14:00:23

MSN故障

2009-07-15 09:30:00

ibatis级联

2010-09-07 11:41:24

SQL语句

2016-01-05 15:30:20

Docker持续集成Docker部署

2009-07-28 11:32:41

光纤链路故障

2011-07-11 09:54:16

DAC登录触发器

2021-06-28 06:45:06

内存溢出内存泄露JavaScript

2010-06-30 14:15:08

SQL Server死
点赞
收藏

51CTO技术栈公众号