[20200220]關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的總結.txt

lfree發表於2020-02-20

[20200220]關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的總結.txt

--//昨天做了大量關於SQLNET.EXPIRE_TIME and ENABLE=BROKEN的測試,晚上再仔細看,測試做的有點亂。
--//做一些總結:

1. 12c之前設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,DCD判斷連結並不使用TCP keep-alive feature特性。它會定期傳送探測包給客
   戶端檢測連結是否正常,如果在1個SQLNET.EXPIRE_TIME之內客戶端有資料包傳送,這個探測包在SQLNET.EXPIRE_TIME(單位:分鐘)時
   間到來時,不會傳送探測資料包給客戶端,這樣有可能出現最大2*SQLNET.EXPIRE_TIME時間端內,沒有傳送探測資料包給客戶端的情
   況。

   這樣會導致一種情況,假設路由器等網路相關設定在10分鐘傳送接受資料包網路就會斷開,設定SQLNET.EXPIRE_TIME最安全的方式是
   設定SQLNET.EXPIRE_TIME=5,這樣才能保持連線在空閒時連結不會斷開。

--//注:關於這個10分鐘來歷,可以參考連結:http://blog.itpub.net/267265/viewspace-2150614/=>[20180129]測量網路斷開時間.txt   

2. 12之前如果不設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,網路連結使用TCP keep-alive feature特性。這點你可以執行
   netsta -npo | grep <spid> 看看最後一個欄位是否是keepalive確定。

   而linux下實際上使用如下引數:
# echo /proc/sys/net/ipv4/tcp_keepalive* | xargs   -n 1  strings -1 -f
/proc/sys/net/ipv4/tcp_keepalive_intvl: 75
/proc/sys/net/ipv4/tcp_keepalive_probes: 9
/proc/sys/net/ipv4/tcp_keepalive_time: 7200

--//引數解析:
/proc/sys/net/ipv4/tcp_keepalive_time    當keepalive起用的時候,TCP傳送keepalive訊息的頻度。預設是2小時。
/proc/sys/net/ipv4/tcp_keepalive_intvl   當探測沒有確認時,keepalive探測包的傳送間隔。預設是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes  如果對方不予應答,keepalive探測包的傳送次數。預設值是9。

預設的引數tcp_keepalive_time設定太長,不使用SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,必須修改核心對應引數符合實際需求。
假設路由器等網路相關設定在10分鐘傳送接受資料包網路就會斷開,這樣必須修改/etc/sysctl.conf檔案:

net.ipv4.tcp_keepalive_time = 590
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes=4

這也是我個人推薦的模式,我個人感覺這樣不會出現上面設定SQLNET.EXPIRE_TIME=5的情況。而且採用TCP keep-alive feature特性
更加科學,因為如果連結有資料包傳送接收,計時重新開始(注:你可以執行sql語句後,使用netsta -npo | grep <spid> 看看最後一個字
段是否是keepalive確定),不會像設定SQLNET.EXPIRE_TIME時,定期傳送探測包給客戶端檢測連結是否正常。

缺點就是必須手工設定核心引數/proc/sys/net/ipv4/tcp_keepalive*引數,符合網路需求。

3.12c之後(包括12c)設定SQLNET.EXPIRE_TIME在sqlnet.ora檔案中,DCD判斷連結使用TCP keep-alive feature特性。實際上就是將
  SQLNET.EXPIRE_TIME的數值換成秒,透過呼叫setsockopt(N, SOL_SOCKET, SO_KEEPALIVE, [1], 4) [注:這裡N對應socket的控制程式碼]。
  可以透過netsta -npo | grep <spid> 觀察 最後一列是否是keepalive確定。

  從這裡也可以看出使用TCP keep-alive feature特性更加合理科學,不然oracle不會採用這種方式。

4.ENABLE=BROKEN 設定在tns連線串中,設定它相當於客戶端使用TCP keep-alive feature特性。
  如果不設定ENABLE=BROKEN,就是出現連結http://blog.itpub.net/267265/viewspace-2150555/=>奇怪的SQLNet message from dblink模擬
  的情況,大約等927秒(15分鐘)才會報錯。

"缺點"就是必須手工設定核心引數/proc/sys/net/ipv4/tcp_keepalive*引數,符合網路需求,[注:是指客戶端的核心引數。]
而且許多客戶端或者中間伺服器使用的是windows系統,如何修改登錄檔,我還給上網查詢測試看看,明天繼續在查一些資料看看。

5.連結是否可以使用TCP keep-alive feature特性,linux下可以透過執行netsta -npo | grep <程式號> 觀察 最後一列是否是keepalive確定。
  這是一種簡單快捷的方式。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2676351/,如需轉載,請註明出處,否則將追究法律責任。

相關文章