监听故障(plsql 连接数据库慢)
问题诊断分析
先简单地介绍系统的环境:是运行在 HP-UX 11.31 下的10.2.0.4的一套rac
- 监听采用配置,比较简单。在配置中使用的是主机名。
- 客户端TNSPING 测试的结果为 260ms左右。
- PLSQL 连接数据库的时间,在 10s 左右。
- 连接上数据库后,执行 SQL 正常,SELECT返回大批量数据的速度也正常,数据库中也没有异常的 NET 方面的等待。
- 使用操作系统工具 PING 数据库主机,返回的结果相当快,只有几毫秒。
- 在数据库主机上使用TNSPING以及通过监听连接数据库,其结果与在客户端机器上一致。但是不通过监听,直接使用 sqlplus “/ as sysdba”这样的方式连接数据库,速度非常快。
- 检查数据库主机/etc 目录下的 resolv.conf、hosts、nsswitch.conf 等配置文件,hosts 文件没有问题,而 resolv.conf 和 nsswitch.conf 文件不存在。
- 检查 listener.log 文件的内容,可以发现连接数据库比较频繁。
- 重新启动监听后,在较短的时间段内,数据库连接速度比较快,但是很快就会回到速度非常慢的状况。检查监听进程的内存使用情况,发现消耗的内存并不多。
- 检查 sqlnet.log 文件内容,没有发现异常。
如果把通过监听连接数据库看作执行一条 SQL,那么连接数据库所花的时间,可用 响应时间=服务时间+等待时间
来计算。这里响应时间为从客户端发起数据库连接到最终连接上数据库所经过的时间,服务时间为从连接过程中监听和 Server Process 真正处理连接请求所消耗的时间,而等待时间就是在连接过程中排队等待处理的时间。
从 listener.log 来看,监听处理一个连接的时间并不是很长,在这个文件中记录的时间戳没有精确到毫秒,平均来看在100ms 左右,平均每秒只能处理 10个连接。如果每秒的连接数在 10 个,最理想的情况每个连接请求都没有排队,那么每连接的时间为100ms 左右,然而,如果在某一时刻,有一个突发的连接高峰,将导致产生连接排队,而导致后续的连接请求所花的时间加长。假如连接队列中有 10 个请求,那么将导致后面的每个请求将需要 1100ms 左右。
监听的工作原理
使用 tusc 时,ps -ef | grep tnslsnr 得到监听进程 tnslsnr 的进程号(pid)。要注意的是ÿ