[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/,如需转载,请注明出处,否则将追究法律责任。