[20180925]共享池中的NETWORK BUFFER(12c).txt

lfree發表於2018-09-25
[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.也會導致記憶體的消耗.

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

相關文章