在ORACLE当中有两个很常见的等待事件“SQL*Net message from client”与“SQL*Net message to client”,二者有点区别,下面整理这方面的资料以下:node
SQL*Net message from client 表示服务端等待着Cilent发来请求让它处理,这时就会产生SQL*Net message from client等待事件。sql
而咱们把这种Wait叫作空闲事件(ildel event),并不表明真正的Loading.数据库
SQL*Net message to client 这个等待事件发生在服务段向客户端发送消息或数据的时候,通常意味着网络瓶颈或不正确的TCP链接配置。缓存
固然它不能作为对网络延迟的准确评估或量化服务器
SQL*Net message from client网络
"Generally SQL*Net message from client means Oracle is just waiting on some work to do. The SQL*Net message from client means that you have a session connected and Oracle is waiting for a command so it can do something.session
If you're thinking that SQL*Net message from client is the cause of a performance issue, there's likely another underlying issue such as the application connecting but not running any statements (which is not an Oracle issue but would appear to the end user as a performance problem), or you're looking in the wrong place for the source of the performance problem."oracle
关于SQL*Net message from client 这种等待事件,很好模拟,以下所示,会话68执行了一个SQL后,一直没有向服务器端发送任何SQL语句,那么在服务器端,会话68一直处于SQL*Net message from client等待事件app
会话68链接到数据库后,执行完一个SQL后,再也不作任何操做。以下所示:tcp
SQL> show user;
USER 为 "TEST"
SQL> select * from v$mystat where rownum=1;
SID STATISTIC# VALUE
---------- ---------- ----------
68 0 0
会话72中查看会话68的状态,就会发现会话68处于SQL*Net message from client等待
SQL> show user;
USER is "SYS"
SQL> select * from v$mystat where rownum=1;
SID STATISTIC# VALUE
---------- ---------- ----------
72 0 0
SQL> select sid, seq#, event, wait_class,seconds_in_wait
2 from v$session_wait where sid=68;
SID SEQ# EVENT WAIT_CLASS SECONDS_IN_WAIT
---------- ---------- -------------------------------- ---------- ---------------
68 42 SQL*Net message from client Idle 314
可是若是此时在会话68里面执行一个SQL语句,你会看到SECONDS_IN_WAIT就会清零从新开始计时。
另外还有一种特殊状况,例如当客户端遭遇网络异常或应用程序奔溃、操做系统蓝屏等等,那么此时对应的会话也会可能遇到SQL*Net message from client空闲等待事件,固然绝大部分状况下,这个等待事件是能够忽略的。
SQL*Net message to client
The SQL*Net message to client may indicate a network-related issue that causes clients too long to get data from the database server. Thus, it can be a TCP issue, but it is not limited to that.
Common causes of a high SQL*Net message to client might include TCP/IP bottlenecks or TNS parameter issues:
High network latency: Check with netstat to ensure that your TCP/IP does not have bottlenecks.
Incorrect TNS parameters: Setting such as tcp.nodelay can impact the time for SQL message to client waits. See these tips on Oracle TNS network tuning .
The SQL*Net message to client Oracle metric indicates the server (foreground process) is sending a message to the client. Network bottlenecks are very common in distributed systems and those with high network traffic
“So, if you’re sending loads of data over a slow link or mis-configured TCP connection, the “SQL*Net message to client” wait time can be used as a low-confidence indicator of your SQL*Net throughput (in conjunction with “bytes sent via SQL*Net to client”), but never a measure of network latency!”
SQL * Net message to client等待事件发生在当一个服务器进程已经发送数据或消息到客户端并正等待回复的时候.这个等待时间是等待从TCP(Transparent Network Substrate)等待响应的时间.这个等待事件一般被认为是一个Network等待事件。SQL * Net message to client等待事件通常意味着网络瓶颈或不正确的TCP链接配置。可是它不能作为对网络延迟的准确评估或量化。当服务端在发送大量数据时, 您能够看到 "SQL * Net message to client" 等待事件所花的时间更长。这个发生在TCP发送缓冲区(TCP send buffer )已满时, 所以TCP堆栈没法接受更多的数据包。数据传送将被阻塞, 直到远程站点发送返回的 ACK 数据包表示它在 TCP 传输流( TCP transmission stream)中的哪些数据已经接收到了。
对于SQL * Net more data to client等待事件,ORACLE使用SDU(session data unit)会话数据单元将SDU缓存写入到TCP套接字缓存中.若是数据比会话数据单元的初始大小大那么数据须要被屡次的发送.若是有大量的数据被发送而后在每批数据发送后这个会话将会等待'SQL * Net more data to client'等待事件.
ORACLE NET容许经过参数SDU(会话数据单元)和TDU(传输数据单元)来控制数据包的大小.它们分别控制会话层和传输层的缓存大小.TDU在数在ORACLE NET v8.0中已经被废弃.
参考资料:
http://www.dba-oracle.com/m_sql_net_message_to_client.htm
http://blog.tanelpoder.com/2008/02/07/sqlnet-message-to-client-wait-gotcha/
http://www.dba-oracle.com/t_sql_net_message_network_throughput.htm