Oracle Net 屬於 OSI 第 5 層 (會話層),坐落於 TCP/IP 協議棧之上。DBA **無法直接調整底層 TCP/IP 參數** (需網管配合),但可控制 **Oracle Net 層面的封包頻率與大小**,間接影響吞吐量。
| 參數 | 所在文件 | 作用層面 | 適用端 |
|---|---|---|---|
| AUTOMATIC_IPC | sqlnet.ora | 本地連線繞過網絡層,直接用 IPC | Server |
| BREAK_POLL_SKIP | sqlnet.ora | 斷點輪詢間隔,減少網路往返 | Client |
| SDU / TDU | tnsnames.ora, listener.ora | 會話數據單元 / 傳輸數據單元大小 | Client & Server |
| TCP.NODELAY | protocol.ora | 禁用 Nagle 演算法,立即發送小封包 | Client & Server |
| QUEUESIZE | listener.ora | 監聽器連接請求佇列長度 | Server |
原理:預設 TCP 會緩衝小封包等待湊大封包 (Nagle),導致延遲。設定 TCP.NODELAY = YES 使每次請求立即發送。
# protocol.ora (Client & Server 端均需設定)
TCP.NODELAY = YES
適用場景:高頻小封包交互 (OLTP、大量分散式事務)。副作用:封包數激增,可能加重網路擁塞,須配合網管評估。
# sqlnet.ora (Server 端)
AUTOMATIC_IPC = ON
機制:檢測連線目標為本機資料庫且別名相同時,自動轉為 IPC (共享記憶體) 通訊,繞過 TCP/IP 棧。僅對資料庫服務器上的本地連線生效,遠程客戶端無效。
# tnames.ora (Client) / listener.ora (Server)
DESCRIPTION =
(ADDRESS = (PROTOCOL=TCP)(HOST=...)(PORT=1521))
(CONNECT_DATA = (SERVICE_NAME=...))
(SDU=8192) # 會話數據單元
(TDU=8192) # 傳輸數據單元
核心原則:
SDU ≤ TDU,否則浪費頻寬MTS/Shared Server 注意:需在 MTS_DISPATCHERS 參數中同步設定 (SDU=...)(TDU=...)。
# sqlnet.ora (Client)
BREAK_POLL_SKIP = 1000
客戶端每 N 次發送/接收操作檢查一次斷點信號 (Ctrl+C)。預設較小,增大可減少系統調用,適用於長時間查詢/批量操作的客戶端。
# listener.ora
LISTENER =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL=TCP)(HOST=marvin)(PORT=1521)(QUEUESIZE=32))
)
適用:高併發連線風暴 (如應用服務器啟動瞬間)。代價:預分配記憶體。限制:部分 Unix 限制最大 5,MTS 有自身佇列限制。高併發首選 MTS/Connection Pooling。
| 場景 | SDU/TDU | TCP.NODELAY | AUTOMATIC_IPC | QUEUESIZE |
|---|---|---|---|---|
| 高頻 OLTP (LAN) | 8192 / 8192 | YES | ON (Server) | 32-64 |
| 大批量數據傳輸 (DW/ETL) | 32767 / 32767 | NO (預設) | OFF | 預設 |
| 廣域網/高延遲鏈路 | 1024 / 1024 | YES | OFF | 預設 |
| 本地高併發 (App Server 同機) | 8192 / 8192 | YES | ON | 64+ |
TRACE_LEVEL_CLIENT = 16 / TRACE_LEVEL_SERVER = 16 (sqlnet.ora)tcp.port == 1521 觀察封包大小、頻率、重傳率V$SESSION_WAIT 等待事件 SQL*Net message from/to client/dblinkSQL*Net roundtrips 統計