本文转载自微信公众号《数据与云》,作者王欣。转载本文请联系数据和云公众号。一、问题描述最近在一个客户的现场进行排查,发现一个系统在用sqlplus/assysdba登录的时候特别慢。经过多次测试,最长时间可以达到将近10s才能成功登录。此时查看主机的CPU、内存、IO、网络参数,发现使用率并不高,远远没有达到瓶颈,登录前后所有操作都很流畅,没有任何卡顿。因此判断可能是在登录sqlplus的时候系统卡住了,由于客户的业务在使用中没有反映任何问题,所以当时只是在日常的错误处理日志中记录了这个问题。但是过了几天,突然客户的业务用户说他们的某个功能经常出现连接超时的问题。这时候肯定业务也受到了sqlplus登录慢的影响。所以特意把这个问题挖出来做进一步的分析和调查。二、问题分析过程在这之前,其实我也多次遇到过sqlplus登录慢的问题,而出现这个问题的原因是客户使用了DNS进行IP解析。sqlplus登录的时候会解析DNS,解析这一步的时间比较长,影响了sqlplus登录过程的耗时。因此,这次我们先入为主,查看服务器环境是否有DNS配置:cat/etc/resolv.conf#GeneratedbyNetworkManager可以发现主机上没有DNS配置,所以登录慢的常见原因sqlplus的不是这个引起的。那么,我们需要进行进一步的调查。首先我们要明白,Oracle数据库的故障排除有一些有用的方法,比如oradebug、事件分析、hanganalyze、strace等,只有选择正确的方法进行故障排除,才能事半功倍努力。至于sqlplus登录慢的问题,由于一开始不知道是数据库问题还是命令调用问题,可以考虑选择hanganalyze或者strace进行排查。针对这个异常,首先对数据库进行了hanganalyzed,但是分析结果并没有发现有阻塞链。所以问题应该出在调用sqlplus命令的原因上。此时,我们可以使用strace来分析:strace-T-tt-o/tmp/strace_sqlplus_local.txtsqlplus/assysdba通过上面的命令,我们可以生成一个sqlplus命令,在执行文件中对Linux进行那些调用。通过这个文件,我们可以看到哪些过程调用比较慢。通过查看和分析生成的文件,发现以下步骤的调用时间异常:可以发现该步骤的调用时间超过了7秒。所以,这个时候我们就可以确定问题出在哪里了。但是这个地方调用慢是什么原因呢?可以看到里面有NTP0的字样,所以我们也怀疑是和NTP服务有关。进一步查看NTP相关服务,发现服务器上没有NTP配置,也没有开启NTP服务。分析到这里,我有点迷糊了。这一步是做什么的?为什么这么慢?这时,我有点不知所措。好在公司里有二线专家。咨询了二线高手后,让我在strace中加上-Fr参数后,离fork调用的子进程又近了一步。strace-T-tt-Fr-o/tmp/strace_sqlplus_local.txtsqlplus/assysdba可以看到有一段mmap()函数调用时间比较长,基本在4s左右(这个可能和上面的时间不匹配,主要是因为它在分析过程中多次生成)。查询后发现mmap函数主要是linux下内存映射到文件的一种方法(这个函数的具体内容和作用,我没有详细研究过),所以可以猜测是登录慢的问题sqlplus可能会出现内存映射上级。于是我们更进一步,查看了Oracle的内存分配和相关内存参数,最后发现了一个参数:pre_page_sga,在当前环境下设置为true,参数默认为false。3、pre_page_sga参数的作用是什么?从官网和其他博客上看,这个参数的作用是这样的:Oracle实例启动时,物理内存中只会加载sga每条内存的最小大小(粒度),而剩下的sga只会在虚拟内存中分配。只有当进程接触到相应的页时,才会在物理内存中进行替换。当该参数设置为TRUE时,不仅实例启动时需要触及所有SGA页,而且由于每个Oracle进程都会访问SGA区,所以每当有新进程启动时(在DedicatedServer模式下,每个session都会启动一个Oracle进程),将触及该进程需要访问的所有页面。通过上面的描述我们可以知道,如果该参数设置为true,那么每次登录sqlplus时,实际上都会生成一个Oracle进程,而这个时候改进后的进程会触及所有需要访问的内存页被访问。当需要访问的内存页较大时,可能会出现速度慢的情况。4、问题解决后来我也建议客户把这个参数改成false,客户修改后重启测试,发现解决了sqlplus登录慢的问题。再次通过strace生成sqlplus的trace文件,可以发现在NTP0时效率变得很高。五、小结该问题属于常见问题,但不是常见原因。一个简单的sqlplus登录慢的问题,可能是由多种原因引起的,包括DNS、内存、过多的adump日志、从trace日志中读取glogin.sql等。这篇文章的目的,其实更多的是为遇到类似问题提供一个分析思路,供大家参考。作者简介王鑫,云和恩墨西区交付团队技术顾问,从事OracleDBA工作7年左右,服务客户包括电力、军工、政府、金融等,拥有多项认证OracleOCP、OCM、PGCA、PGCE,擅长Oracle数据库迁移、异常诊断。