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

来源:这里教程网 时间:2026-03-03 12:01:53 作者:
[20180925]共享池中的NETWORK BUFFER(12c).txt --//最近几天一直在探究SQL*Net more data from client 相关等待事件,发现SDU相关,自己也网上探究一些帖子,找到刘公的一个帖子. --//链接:http://www.askmaclean.com/archives/%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.思考: --//http://www.askmaclean.com/archives/%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.也会导致内存的消耗.

相关推荐