ITPub博客

首页 > 数据库 > Oracle > [20180925]共享池中的NETWORK BUFFER(12c).txt

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

原创 Oracle 作者:lfree 时间:2018-09-25 21:19:17 0 删除 编辑
[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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
熟悉oracle相关技术,擅长sql优化,rman备份与恢复,熟悉linux shell编程。

注册时间:2008-01-03

  • 博文量
    2859
  • 访问量
    6645288