Chinaunix首页 | 论坛 | 博客
  • 博客访问: 593886
  • 博文数量: 841
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-28 10:08
文章分类

全部博文(841)

文章存档

2011年(1)

2008年(840)

我的朋友

分类:

2008-10-28 10:09:27

DCD 起初是专为 客户机没有从会话中断开联接的情况下断电的环境设计的.

    DCD由服务端开始建立联接. 这时候SQL*Net 从参数文件中读取变量, 设置一个定时器定时产生信号. 这个时间间隔是sqlnet.ora文件中的SQLNET.EXPIRE_TIME提供的.
   
    当定时器设定的时间到了之后, 上的SQL*Net 发送一个探测包到客户端.(如果是数据库联接, 目的端的发送探测包到另一端). 探测包是由空的SQL*Net包组成, 不体现SQL*Net层任何数据, 但会在下一层的网络中产生数据流量.

    如果客户端的联接仍然是活动的, 探测包被丢弃. 计时装置复位. 如果客户端异常断掉. 服务器将收到由发送探测包的调用发出的错误. SQL*Net 将会通知操作系统释放联接占用的资源.

    在Unix服务器上 sqlnet.ora 文件必须存在$TNS_ADMIN 或者 $ORACLE_HOME/network/admin目录下.   而不是/etc 或者 /var/opt/oracle

    同时也应该注意, SQL*Net 2.1.x中 一个活动的孤儿进程(例如, 单独的查询进程) 在查询完成之前不会被杀掉. SQL*Net 2.2中孤儿进程占用的资源将会被无条件释放.

    这只是服务器的特性,  客户端将会支持任何SQL*Net V2 的发行版
   
    栈的功能
   
    虽然 死联接检测是在SQL*Net层的, 但要成功执行在很大程度上要依靠下层栈. 例如, 如果在sqlnet.ora文件中 设置SQLNET.EXPIRE_TIME=1, 但是一个孤儿进程很有可能在间隔到了之后被清除掉.

    TCP/IP协议是一个面向联接的协议, 同样的, 这个协议在超时时执行重传数据包的操作, 确保数据的和数据包的顺序. 如果对探测包没有及时回应, TCP/IP栈将在一段时间内重传这个包. 当TCP/IP放弃重传之后, SQL*Net 将会收到 探测失败的通知.

    TCP/IP超时的时间取决于 TCP/IP栈,  超时很多分钟是很常见的, 这个涉及到很多客户, 许多协议层的重传会造成孤儿进程被杀掉之前要等很长时间.

    最简单的办法检测协议栈有这个延迟需要不同的DCD间隔.
   
    协议栈
   
    设置参数SQLNET.EXPIRE_TIME = 1 min, 注意清除孤儿进程需要的时间. 然后设置为 5min,
    再次观察这个时间. 如果服务器没有释放资源是由于TCP/IP超时造成的, 清除影子的时间需要增加到4min.
    如果TCP/IP超时重传是造成问题的所在, 操作系统的内核参数应该调整一下, 在Unix平台下, /usr/include/netinet/tcp_timer.h 中包含着配置参数.

    减小重传间隔可能会影响系统的其它部分, 因为实际上减小了联接处理数据的窗口, 可能会在系统重负荷的情况下丢失联接, 远程慢的联接会受到这个更改的影响。

    系统参数会影响超时重传的有 TCP_TTL, TCPTV_PERSMIN, TCPTV_MAX, 和 TCP_LINGERTIME等。
    ********************
    为了防止对系统其他进程产生影响, 在调整系统参数时最好向相关的厂家咨询
    *******************

[1]  

【责编:Kittoy】

--------------------next---------------------

阅读(357) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~