[20180925]共享池中的NETWORK BUFFER(12c).txt
[20180925]共享池中的NETWORK BUFFER(12c).txt
--//最近幾天一直在探究SQL*Net more data from client 相關等待事件,發現SDU相關,自己也網上探究一些帖子,找到劉公的一個帖子.
--//連結:%e5%85%b1%e4%ba%ab%e6%b1%a0%e4%b8%ad%e7%9a%84network-buffer.html
--//雖然大多少場合使用dedicated server模式,而如果採用共享伺服器模式,NETWORK BUFFER將被大量使用。
--//當然作者提到bug在11.2.0.4下已經不復存在.但是在共享伺服器模式下,NETWORK BUFFER將被大量使用,我還第一次知道,我決定測試看看:
1.環境:
SCOTT@test01p> @ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
SCOTT@test01p> show parameter dispatchers
NAME TYPE VALUE
--------------- -------- --------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=testXDB)
max_dispatchers integer
SCOTT@test01p> show parameter shared_servers
NAME TYPE VALUE
------------------------------------ -------------------- ------
max_shared_servers integer
shared_servers integer 1
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 341752
--//啟動1個會話:
--//sqlplus system/btbtms@127.0.0.1:1521/testxdb
SYSTEM@127.0.0.1:1521/testxdb> select saddr,sid,paddr,status,server from v$session where sid in (select sid from v$mystat);
SADDR SID PADDR STATUS SERVER
---------------- ---------- ---------------- -------------------- ---------
000007FF309B0F88 88 000007FF30FA15B0 ACTIVE SHARED
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 409560
--//409560-341752 = 67808,可以發現啟動1個共享會話,NETWORK BUFFER增加.
2.建立測試指令碼:
$ cat b.sh
#!/bin/bash
for i in $(seq 40)
do
sqlplus -s system/btbtms@127.0.0.1:1521/testxdb <<EOF > /dev/null 2>&1 &
select sysdate from dual ;
host sleep 60
quit;
EOF
done
3.測試:
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 341752
$ source b.sh
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 3105040
--//3105040-341752 = 2763288
--//2763288/40 = 69082.20
4.繼續測試,修改SDU=32768.
--//修改sqlnet.ora加入,安裝劉工文章介紹,最大32767.
DEFAULT_SDU_SIZE=32768
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 392384
$ source b.sh
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 11092152
--//11092152-392384 = 10699768
--//10699768/40 = 267494.200
--//如果設定DEFAULT_SDU_SIZE=32768 ,NETWORK BUFFER消耗明顯增加.
--//40個會話消耗10M.如果1000個,這樣可以達到250M.還是蠻可觀的.
5.思考:
--//%e5%85%b1%e4%ba%ab%e6%b1%a0%e4%b8%ad%e7%9a%84network-buffer.html
你可能會問SDU是什麼?Oracle NET快取的資料以SDU為基本單位,SDU即 session data unit,一般預設為8192 bytes。當這些資料單元
被寫滿,或被client讀取時,他們將被傳遞給Oracle Network層(oracle network layer)。譬如Data Guard環境中redo傳輸的每個Chunk
往往要大於8192 bytes,那麼預設的SDU就不太適用。當有大量重做資料要傳輸到standby庫時,增大SDU buffer的大小可以改善Oracle的
網路效能。你可以很方便的透過修改sqlnet.ora配置檔案來修改SDU,如在該檔案內加入以下條目:
DEFAULT_SDU_SIZE=32767 /*修改全域性預設SDU到32k*/
當然你也可以在tnsnames.ora中定義服務別名時個別指定SDU,下文我們會用到。
如上文所述在版本10.2.0.3以前當會話建立時,Oracle會以dispatchers引數定義的SDU為單位,分配3個單位的NETWORK BUFFER,而實際
上client端可能並未指定和dispatchers一致的SDU,若dispatchers中定義的SDU為32k,而client使用預設的8k SDU,則一個會話可能要浪
費3*32-3*8=72k的NETWORK BUFFER。
為什麼共享伺服器模式下會用到共享池中的NETWORK BUFFER,而獨享伺服器模式下沒有呢?因為在獨享伺服器模式下每個會話所分配的三
個SDU是從PGA中獲取的;當使用共享伺服器模式時會話與服務程式形成一對多的對映關係,這三個SDU 的NETWORK BUFFER同UGA一樣轉移
到了SGA中。
--//這樣如果預設設定很大,不管共享還是專用模式,導致記憶體消耗增加.
--//共享伺服器模式消耗在共享池,如果大量連線使用這個模式,消耗也很大.而且這樣配置要求共享池要設定大一些.
--//專用伺服器模式消耗在PGA.也會導致記憶體的消耗.
--//最近幾天一直在探究SQL*Net more data from client 相關等待事件,發現SDU相關,自己也網上探究一些帖子,找到劉公的一個帖子.
--//連結:%e5%85%b1%e4%ba%ab%e6%b1%a0%e4%b8%ad%e7%9a%84network-buffer.html
--//雖然大多少場合使用dedicated server模式,而如果採用共享伺服器模式,NETWORK BUFFER將被大量使用。
--//當然作者提到bug在11.2.0.4下已經不復存在.但是在共享伺服器模式下,NETWORK BUFFER將被大量使用,我還第一次知道,我決定測試看看:
1.環境:
SCOTT@test01p> @ver1
PORT_STRING VERSION BANNER CON_ID
------------------------------ -------------- -------------------------------------------------------------------------------- ----------
IBMPC/WIN_NT64-9.1.0 12.1.0.1.0 Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production 0
SCOTT@test01p> show parameter dispatchers
NAME TYPE VALUE
--------------- -------- --------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=testXDB)
max_dispatchers integer
SCOTT@test01p> show parameter shared_servers
NAME TYPE VALUE
------------------------------------ -------------------- ------
max_shared_servers integer
shared_servers integer 1
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 341752
--//啟動1個會話:
--//sqlplus system/btbtms@127.0.0.1:1521/testxdb
SYSTEM@127.0.0.1:1521/testxdb> select saddr,sid,paddr,status,server from v$session where sid in (select sid from v$mystat);
SADDR SID PADDR STATUS SERVER
---------------- ---------- ---------------- -------------------- ---------
000007FF309B0F88 88 000007FF30FA15B0 ACTIVE SHARED
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 409560
--//409560-341752 = 67808,可以發現啟動1個共享會話,NETWORK BUFFER增加.
2.建立測試指令碼:
$ cat b.sh
#!/bin/bash
for i in $(seq 40)
do
sqlplus -s system/btbtms@127.0.0.1:1521/testxdb <<EOF > /dev/null 2>&1 &
select sysdate from dual ;
host sleep 60
quit;
EOF
done
3.測試:
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 341752
$ source b.sh
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 3105040
--//3105040-341752 = 2763288
--//2763288/40 = 69082.20
4.繼續測試,修改SDU=32768.
--//修改sqlnet.ora加入,安裝劉工文章介紹,最大32767.
DEFAULT_SDU_SIZE=32768
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 392384
$ source b.sh
SYSTEM@test> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 11092152
--//11092152-392384 = 10699768
--//10699768/40 = 267494.200
--//如果設定DEFAULT_SDU_SIZE=32768 ,NETWORK BUFFER消耗明顯增加.
--//40個會話消耗10M.如果1000個,這樣可以達到250M.還是蠻可觀的.
5.思考:
--//%e5%85%b1%e4%ba%ab%e6%b1%a0%e4%b8%ad%e7%9a%84network-buffer.html
你可能會問SDU是什麼?Oracle NET快取的資料以SDU為基本單位,SDU即 session data unit,一般預設為8192 bytes。當這些資料單元
被寫滿,或被client讀取時,他們將被傳遞給Oracle Network層(oracle network layer)。譬如Data Guard環境中redo傳輸的每個Chunk
往往要大於8192 bytes,那麼預設的SDU就不太適用。當有大量重做資料要傳輸到standby庫時,增大SDU buffer的大小可以改善Oracle的
網路效能。你可以很方便的透過修改sqlnet.ora配置檔案來修改SDU,如在該檔案內加入以下條目:
DEFAULT_SDU_SIZE=32767 /*修改全域性預設SDU到32k*/
當然你也可以在tnsnames.ora中定義服務別名時個別指定SDU,下文我們會用到。
如上文所述在版本10.2.0.3以前當會話建立時,Oracle會以dispatchers引數定義的SDU為單位,分配3個單位的NETWORK BUFFER,而實際
上client端可能並未指定和dispatchers一致的SDU,若dispatchers中定義的SDU為32k,而client使用預設的8k SDU,則一個會話可能要浪
費3*32-3*8=72k的NETWORK BUFFER。
為什麼共享伺服器模式下會用到共享池中的NETWORK BUFFER,而獨享伺服器模式下沒有呢?因為在獨享伺服器模式下每個會話所分配的三
個SDU是從PGA中獲取的;當使用共享伺服器模式時會話與服務程式形成一對多的對映關係,這三個SDU 的NETWORK BUFFER同UGA一樣轉移
到了SGA中。
--//這樣如果預設設定很大,不管共享還是專用模式,導致記憶體消耗增加.
--//共享伺服器模式消耗在共享池,如果大量連線使用這個模式,消耗也很大.而且這樣配置要求共享池要設定大一些.
--//專用伺服器模式消耗在PGA.也會導致記憶體的消耗.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2214843/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [20180926]共享池中的NETWORK BUFFER.txt
- [20180925]等待事件SQLNet more data from client 6.txt事件SQLclient
- [20190524]DISABLE TABLE LOCK(12c).txt
- [20190703]12c Hybrid histogram.txtHistogram
- [20190624]12c group by優化 .txt優化
- [20210119]sqlplus 12c LOBPREFETCH.txtSQL
- [20181026]12c Attribute Clustering特性.txt
- 12C SQL Translation Framework.txtSQLFramework
- [20181010]12c clone pdb.txt
- [20211202]完善d_buffer.sql指令碼.txtSQL指令碼
- [20201231]單例項data buffer states.txt單例
- [20180305]手工模擬buffer busy wait.txtAI
- [20200120]12c Group by Elimination bug.txt
- [20200809]12c熱備份模式.txt模式
- [20181127]12c Advanced Index Compression.txtIndex
- [20181011]12c set FEEDBACK only.txt
- [20181009]12C FULL DATABASE CACHING.txtDatabase
- [20181116]SYS_CONTEXT函式的使用(12c).txtContext函式
- [20180310]12c exp 無法dirct的情況.txt
- [20191202]tmux共享回話.txtUX
- [20210104]單例項data buffer states 2.txt單例
- [20201231]RAC buffer states: XCUR, SCUR, PI,CR.txt
- [20191106]12c DCD SQLNET.EXPIRE_TIME.txtSQL
- [20181026]12c Attribute Clustering特性2.txt
- [20181018]12c Pluggable Database save state.txtDatabase
- [20181018]Oracle Database 12c: Data Redaction.txtOracleDatabase
- [20190107]12c以上版本配置dg注意.txt
- [20181127]12c Advanced Index Compression 2.txtIndex
- [20181005]安裝12C在windows.txtWindows
- [20200423]12c刪除不需要的記錄.txt
- [20231023]備庫與alter system flush buffer_cache.txt
- [20211025]12c sequence nocache測試補充.txt
- [20190805]Oracle 12c New Feature – Online Partitioning.txtOracle
- [20190911]12c dml redo優化2.txt優化
- [20190718]12c rman新特性 表恢復.txt
- [20200818]12c 10046跟蹤時間戳.txt時間戳
- [20201207]12c v$open_cursor檢視.txt
- [20181023]12c網路資料壓縮.txt