实战例子:用strace分析数据库连接问题

上一篇博文讲了很多系统调用函数,这些知识再加上经验积累,可用于在实际工作中分析和解决问题。

问题:香港机房的一台linux服务器,上面安装的sqlplus无法连接到深圳公司机房的oracle server,执行sqlplus xxxx/[email protected]的时候直接没反应,经过2分钟左右,报:

SQL*Plus: Release 11.2.0.1.0 Production on Tue Apr 21 15:44:04 2015

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

ERROR:
ORA-12547: TNS:lost contact

环境:

客户端机器地址为:172.17.5.13(redhat5.8+oracle11g client)
服务端机器地址为:192.168.1.48(solaris9+oracle10g server)

经过测试:

1、tnsping rwdb正常,这说明客户端tnsnames配置没有问题

2、在其它环境下测试redhat5.8+oracle 11g client连接solaris9+oracle 10g server,成功,无兼容性问题。

那么,如何继续排查问题呢?这个时候strace就派上用场了。

在客户端机器上执行:

#strace -o strace.log sqlplus xxxx/[email protected]

卡住的时候,strace.log显示:

brk(0x9196000)                          = 0x9196000
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 9
fcntl(9, F_SETFL, O_RDONLY|O_NONBLOCK)  = 0
connect(9, {sa_family=AF_INET, sin_port=htons(1521), sin_addr=inet_addr("192.168.1.48")}, 16) = -1 EINPROGRESS (Operation now in progress)
times({tms_utime=1, tms_stime=1, tms_cutime=0, tms_cstime=0}) = 2186561939
mmap(NULL, 528384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ae433057000
poll([{fd=9, events=POLLOUT}], 1, 60000) = 1 ([{fd=9, revents=POLLOUT}])
getsockopt(9, SOL_SOCKET, SO_ERROR, [-132438043876392960], [4]) = 0
fcntl(9, F_GETFL)                       = 0x802 (flags O_RDWR|O_NONBLOCK)
fcntl(9, F_SETFL, O_RDWR)               = 0
getsockname(9, {sa_family=AF_INET, sin_port=htons(53136), sin_addr=inet_addr("172.17.5.13")}, [549755813904]) = 0
getsockopt(9, SOL_SOCKET, SO_SNDBUF, [366915001648168960], [4]) = 0
getsockopt(9, SOL_SOCKET, SO_RCVBUF, [366915001648239956], [4]) = 0
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
fcntl(9, F_SETFD, FD_CLOEXEC)           = 0
rt_sigaction(SIGPIPE, {0x1, ~[ILL ABRT BUS FPE SEGV USR2 XCPU XFSZ SYS RTMIN RT_1], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x35a240ebe0}, {SIG_DFL, [], 0}, 8) = 0
write(9, "\0\324\0\0\1\0\0\0\1:\1,\fA \0\177\377\177\10\0\0\1\0\0\232\0:\0\0\10\0"..., 212) = 212
read(9,

分析:

这里的fd9是一个客户端连接服务端(192.168.1.48)1521端口的socket,这个socket的建立是正常的,但是当write发出第一个消息出去后就卡顿了。这里我们有理由开始怀疑网络问题,是否网络不稳定导致了sqlplus的异常。

果然,通过测试,发现香港到深圳的这个vpn网络环境不稳定,存在丢包:

#ping -s 172.17.5.13 1024 >ping.log

14%的丢包率:
530 packets transmitted, 455 packets received, 14% packet loss
round-trip (ms)  min/avg/max = 11/11/17

联系网络管理员,将路由从vpn切换至另外一个专线通道后问题解决,sqlplus连接成功。这个case也说明,sqlplus对网络环境是要求很高的,之前一直以为即使有丢包也应该能连上,但事实并非如此。

小结:

通过对strace的分析,可能未必能一次性解决问题,还得考虑其它因素。这个case,即使不分析strace,通过测试网络,最终也能发现问题,但strace可以很好地提供一个证据和参考,这里socket通信有问题就是证据,否则凭什么说是网络引起的问题呢?

时间: 2024-10-16 03:12:14

实战例子:用strace分析数据库连接问题的相关文章

数据分析实战之自如房租分析

代码地址如下:http://www.demodashi.com/demo/13312.html 项目说明 通过对深圳自如网站上的房源情况进行探索分析,进而了解深圳自如房租的相关情况. 探索的问题 房租的分布情况 哪种户型的房源最多 哪条地铁线附近的房租比较贵 哪个区的房租更贵 房源的面积分布情况 数据说明 数据来源深圳自如网站(仅包含可出租状态的合租房源) 采用集搜客工具爬取 house_area: 表示房间的面积 house_toom: 表示出租房屋的户型 house_price: 表示每月的

实际测试例子+源码分析的方式解剖MyBatis缓存的概念

前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ MyBatis缓存介绍首先看一段wiki上关于MyBatis缓存的介绍: MyBatis支持声明式数据缓存(declarative data caching).当一条SQL语句被标记为"可缓存"后,首次执行它时从数据库获取的所有数据会被存储在一段高速缓存中,今后执行这条语句时就会从高速缓存中读取结果,而不是再次命中数据库.MyBatis提供了默认下基于

Hadoop项目实战-用户行为分析之应用概述(三)

1.概述 本课程的视频教程地址:<项目工程准备> 如果本教程能帮助到您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也可以领取五天的会员时间哦(即使是购买年会员目前也仅仅是年费260),成为极客学院学习会员可以无限制的下载和观看所有的学院网站的视频,谢谢您的支持! 本节给大家分享的主题如下图所示: 下面我开始为大家分享今天的第三节的内容——<项目工程准备>,接下来开始分享今天的内容. 2.内容 从本节开始,我们将进

Hadoop项目实战-用户行为分析之应用概述(一)

1.概述 本课程的视频教程地址:<Hadoop 回顾> 如果本教程能帮助到您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,手机端首次也可以领取五天的会员时间哦(即使是购买年会员目前也仅仅是年费260),成为极客学院学习会员可以无限制的下载和观看所有的学院网站的视频,谢谢您的支持! 好的,下面就开始本篇教程的内容分享,本篇教程我为大家介绍我们要做一个什么样的Hadoop项目,并且对Hadoop项目的基本特点和其中的难点做有针对性的剖析,完

推荐一本《实战Java虚拟机》的书,有200个虚拟机实战例子

啥都不说了,例子多,实战多,直接上图.

《从机器学习到深度学习基于scikit-learn与TensorFlow的高效开发实战》PDF代码分析

用通俗的语言讲解涵盖算法模型的机器学习,主要内容包括机器学习通用概念.三个基本科学计算工具.有监督学习.聚类模型.降维模型.隐马尔可夫模型.贝叶斯网络.自然语言处理.深度学习.强化学习.模型迁移等.在深入浅出地解析模型与算法之后,介绍使用Python相关工具进行开发的方法.解析经典案例,能理解.能设计.能编码.能调试,没有基础的在学习后也能够上手设计与开发机器学习产品. 推荐学习<从机器学习到深度学习:基于scikit-learn与TensorFlow的高效开发实战>,场景式机器学习实践,理论

大数据实战:用户流量分析系统

本文是结合hadoop中的mapreduce来对用户数据进行分析,统计用户的手机号码.上行流量.下行流量.总流量的信息,同时可以按照总流量大小对用户进行分组排序等.是一个非常简洁易用的hadoop项目,主要用户进一步加强对MapReduce的理解及实际应用.文末提供源数据采集文件和系统源码. 本案例非常适合hadoop初级人员学习以及想入门大数据.云计算.数据分析等领域的朋友进行学习. 一.待分析的数据源 以下是一个待分析的文本文件,里面有非常多的用户浏览信息,保扩用户手机号码,上网时间,机器序

iOS开发——项目实战总结&amp;数据持久化分析

数据持久化分析 plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 当存储大块数据时你会怎么做? 你有很多选择,比如: 使用`NSUerDefaults` 使用XML, JSON, 或者 plist 使用NSCoding存档 使用类似SQLite的本地SQL数据库 使用 Core Data NSUserDefaults的问题是什么?虽然它很nice也很便捷,但是它只适用于小数据,比如一些简单的布尔型的设置选项,

Hadoop项目实战-用户行为分析之编码实践

1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编码.调度流程.下面我们来看看本课程有哪些课时,如下图所示: 首先,我们来学习第一课时:<Hadoop项目基础代码>. 2.内容 2.1 Hadoop项目基础代码 本课时介绍编写Hadoop基础代码及脚本,在前面搭建好的Hadoop项目工程上, 完成项目的基本代码的编写,以及一些注意事项,为编写核心