排查Oracle TNS 10秒延时

Posted 写程序的康德

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排查Oracle TNS 10秒延时相关的知识,希望对你有一定的参考价值。

我们的一个系统最近更换了测试环境,刚上线就发现一个奇怪的问题——每个SQL查询都至少要延时7-10秒之后才会有反应。系统使用的是Oracle数据库,虽然没有使用数据库连接池但是也不应该会有“10的秒延时”,我Debug了Oracle的客户端库,发现客户端的停顿是出现在等待网络数据,通过tcpdump抓取TNS数据包再次印证了这一点——有10秒钟的时间再等待服务器端返回数据包。所以问题可以确定是出现在Oracle服务器上面。回想了一下Oracle的架构,TNS是负责响应用户请求转发请求到实例,所以对于Oracle来说它可以启动多个TNS提高系统的“并发能力”。(非常巧妙的设计)TNS提供的配置选项非常少,基本上没有什么参数可以调整(你可以查看完整的listener.ora配置,基本上都是对网络传输的一些优化),几乎陷入了死局。有时候解决问题就是这样,知道问题出现某个部分但是限于没有这部分的源代码或者时间不允许我们去翻源代码往往只能通过“猜”->“试”的办法去“暴力破解”。一般这种情况下我会选择一种不一样的Debug方法——通过一些工具去获知系统的内部执行轨迹比如获知系统调用,这种方法一般情况下都非常有效。祭出大杀器—— strace,这是Linux下的一个小工具可以跟踪某个进程的系统调用,通过参数p可以指定PID。f参数会跟踪fork出来的线程或者子进程;r参数会输出系统调用的执行时间。也有人喜欢用DTrace,我觉得这玩意太重,动不动就得写一个脚本啥的。不可否认它要比strace牛B多了,但是我只是想看一下系统调用——所以strace足够了。
执行strace -fr -p 19535其中19535是TNS的PID。输出分为三列,第一列是PID,第二列是执行时间,第三列是执行的系统调用和传递的参数。我们直接看可疑的部分:

小发现

克服惰性

克服惰性是非常难的一件事情,最近在“搞大新闻”很多精力都花费在上面,从本周开始继续——写作。


欢迎关注公众账号了解更多信息“写程序的康德——思考、批判、理性”


以上是关于排查Oracle TNS 10秒延时的主要内容,如果未能解决你的问题,请参考以下文章

Oracle监听启动-ORA-12541: TNS: 无监听程序

求一个51单片机延时1秒的程序,用汇编!!

请教Oracle11监听无法自动启动怎么办?总提示TNS-12541: TNS: 无监听程序 错误。

Oracle TNS 权限被拒绝 *

oracle TNS问题 ORA-12154: TNS:could not resolve the connect identifier specified

安装oracle10的错误“ORA-12560 TNS 协议适配器错误”怎么解决