Oracle监听的优化思路优化思路如下:
- 为减少客户端和服务端网络之间TCP包的传输数量,可在sqlplus客户端设置参数ARRAYSIZE。假设ARRAYSIZE默认大小为15,表示应用每次将获取15行的数据。如果TCP包大小(排除包头等元数据之后,真正可存放1460B大小的数据)超过ARRAYSIZE行数据的总字节大小时,我们应评估一个TCP包能容纳多少行数据,并设置最优的ARRAYSIZE大小。过小的ARRAYSIZE,需要用更多的TCP包来传递业务数据,这将影响业务程序的性能。
- 由2.1节可知Oracle Net Services位于OSI模型的会话层,参数SDU(Session Data Unit)表示网络会话层(Network Session (NS) layer)和网络传输层之间的缓冲大小。在Net*8 和 Oracle*Net (8.0 或更高版本)中,专用服务器模式的缓冲大小为2KB,共享服务器模式为32KB。从Oracle 11.2开始,专用服务器模式的缓冲大小增长为8KB,共享服务器模式为65KB。在静态注册的环境下可以在listener.ora和tnsnames.ora增加关键字(SDU=4096)来增加缓冲大小。如果是在共享服务器模式下,则可以在DISPATCHERS增加关键字SDU=8192来增加缓冲区大小。而对于动态注册环境,只需要在客户端和服务端的配置文件sqlnet.ora中增加DEFAULT_SDU_SIZE = 8192即可。
- 调整操作系统的TCP的发送和接受缓冲区大小。如:AIX系统的参数tcp_sendspace和tcp_recvspace。
- 调整Oracle的TCP的发送和接受缓冲区大小。从Oracle 10g开始,可以通过调整SEND/RECV_BUF_SIZE大小来达到这一目的。从经验上来看,这两个参数在广域网(WAN)传输中可能会提高一定的性能。
- 通过设置监听参数QUEUESIZE来提高监听处理的最大并发数,当最大并发数超过QUEUESIZE时可能会出现错误:TNS-12535 / ORA-12535: TNS:operation timed out。调整该参数需要结合操作系统相关参数来进行,详见MOS文章:214122.1。
- 增加监听来处理更多的并发数。比如在服务器端分别开设1521端口和1522端口的监听,根据监听的繁忙程度,客户端可以选择相对空闲的监听来连接数据库。
- 将客户端连接方式从短连接修改为长连接或者使用连接池。大量的短连接无疑会消耗更加多的系统CPU时间片和Oracle资源。
- 如果Oracle客户端和服务端处于同一台服务器,连接数据库可以考虑用IPC协议代替TCP协议。使用IPC协议可以绕过监听环节,直接和数据库相连。如下所示:
[ora10g@capaa ~]$ sqlplus "zhoul/zhoul"
- 检查监听日志大小,过大的监听日志在某些Oracle版本下可能会导致连接缓慢,甚至监听无法启动,如下所示:
[oracle@hzmc admin]$ lsnrctl start
LSNRCTL for Linux: Version 9.2.0.4.0 - Production on 02-MAR-2011 23:37:53
Copyright (c) 1991, 2002, Oracle Corporation. All rights reserved.
Starting /oracle/app/oracle/product/9.2.0/bin/tnslsnr: please wait...
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 32: Broken pipe
注意 ping命令调用的是ICMP/IP协议,而非TCP/IP协议,且不在节点之间传输TCP数据。用ping命令监测服务器之间的网络环境,其响应时间的快慢并不能真实地反应出网络环境。如果ping速度比较快,只能说明服务器通过各种路由能够快速到达对端服务器而已。