首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 網路效能調優:SDU/TDU、TCP.NODELAY、IPC 繞越與封包優化實戰

     編輯:Oracle 資料庫相關知識

網路層定位

Oracle Net Services 位於 **OSI 第 5 層 (Session Layer)**,封裝在 TCP/IP 之上。DBA 可調整 **封包大小 (SDU/TDU)**、**傳送頻率 (TCP.NODELAY)**、**本地連線繞越 (IPC)**,但底層 TCP 視窗、MTU、路由需網管配合。

關鍵調優參數對照表

參數檔案作用端預設值建議值影響
SDUtnsnames.ora / listener.oraClient/Server2 KB8~32 KB (≤ MTU)單次網路封包承載量,減少 Round-trip
TDUtnsnames.ora / listener.oraClient/Server2 KB= SDU 或 2×SDU傳輸緩衝單位,配合 SDU 優化
TCP.NODELAYprotocol.oraClient/ServerNO (Nagle 啟用)YES關閉 Nagle 演算法,小封包立即發送,降低延遲
AUTOMATIC_IPCsqlnet.oraServerOFFON (本地連線)本地連線自動轉 IPC,繞過網路堆疊
BREAK_POLL_SKIPsqlnet.oraClient04~10減少斷點輪詢頻率,降低 CPU

配置實戰範例

1. protocol.ora — 關閉 Nagle (關鍵!)


# $ORACLE_HOME/network/admin/protocol.ora
TCP.NODELAY = YES
**效果**:每個請求/回應立即發送,不等待緩衝區滿。**代價**:封包數增加、頻寬佔用略增、高併發下可能加劇網路擁塞。**適用**:低延遲敏感 OLTP、跨資料庫連結 (DB Link)、Data Guard 同步傳輸。**不適用**:大量批次傳輸 (Data Pump, RMAN) — 可在 Session 級 ALTER SESSION SET EVENTS '10198 TRACE NAME CONTEXT FOREVER, LEVEL 1' 臨時關閉。

2. tnsnames.ora / listener.ora — SDU/TDU 優化


# tnsnames.ora (Client)
PROD =
  (DESCRIPTION =
    (SDU=32767) (TDU=32767)
    (ADDRESS = (PROTOCOL=TCP)(HOST=prod-db)(PORT=1521))
    (CONNECT_DATA = (SERVICE_NAME=PROD))
  )

# listener.ora (Server)
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL=TCP)(HOST=prod-db)(PORT=1521))
      (SDU=32767) (TDU=32767)
    )
  )
**MTU 限制**:乙太網標準 MTU 1500 Bytes,扣除 IP/TCP 標頭 ~40 Bytes,**實際 SDU 上限 ≈ 1460**。若啟用 Jumbo Frame (MTU 9000),SDU 可設 8192~32767。**兩端必須一致**,否則以較小者為準。

3. sqlnet.ora — 本地 IPC 繞越與輪詢優化


# sqlnet.ora (Server)
AUTOMATIC_IPC = ON
# 本地連線 (Bequeath) 自動使用 IPC/Bequeath 協議,完全繞過 Listener/TCP 堆疊

# sqlnet.ora (Client)
BREAK_POLL_SKIP = 4
# 減少 OCI 客戶端檢查 Ctrl+C 斷點的頻率,降低 CPU 佔用

驗證與監控


-- 1. 確認實際 SDU 生效
SELECT sid, serial#, paddr, sdu, tdu FROM v$session_connect_info WHERE sid = SYS_CONTEXT('USERENV','SID');

-- 2. 封包追蹤 (WireShark / tcpdump)
tcpdump -i eth0 -nn -s 0 port 1521 -w oracle.pcap

-- 3. 網路延遲測量
SELECT * FROM v$session_wait WHERE event LIKE 'SQL*Net%';
-- 常見事件: SQL*Net message to client / from client / more data to client

常見誤區

  1. 盲目設 SDU=32767:若網路路徑 MTU 1500,大封包會在 IP 層分片,**反而增加 CPU 與延遲**。
  2. 忽略 TCP.NODELAY 副作用:大批次傳輸 (拋棄式載入) 開啟會導致大量微小封包,**吞吐量下降 30%+**。
  3. 以為網路調優能解決所有慢查詢:90% 「網路慢」其實是 **SQL 慢、鎖等待、資源不足**。先查 V$SESSION_WAIT 確認等待事件再動網路參數。

結語

Oracle 網路調優核心三板斧:**SDU/TDU 對齊 MTU/Jumbo Frame**、**TCP.NODELAY 低延遲場景開啟、批次場景關閉**、**AUTOMATIC_IPC 本地連線繞越**。參數調整必須 **兩端一致**、**有基線對比**、**納入變更管理**。記住:網路只是管道,**資料流動效率取決於 SQL 與索引**。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved