[20180926]共享池中的NETWORK BUFFER.txt
[20180926]共享池中的NETWORK BUFFER.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将被大量使用。MOS文档[741523.1]叙述了
--//NETWORK BUFFER的主要用途:
On 10.2, after upgrading from 9iR2, the following error occurs:
ORA-07445: exception encountered: core dump [] [] [] [] [] []
plus
Dispatcher Trace file contains an ORA-4031 Diagnostic trace, with:
Allocation request for: NETWORK BUFFER
…followed by…
found dead dispatcher 'D000', pid = (12, 1)
The amount of memory used by NETWORK BUFFERs in the shared pool has significantly grown between 9.2 and 10.2. The
side-effect is to run-out of Shared Pool memory (reporting an ORA-4031), when a large number of sessions are connecting
to the server (in the order of 1000's).
While a session is being established, we allocate 3 buffers each of 32k in size. After the session is established, we
use the 3 SDU-sized buffers, however we do not deallocate the 3x32k buffer we allocated initially.
This issue has been logged in unpublished Bug 5410481.
Additionally, there is Bug 6907529.
NS buffers are allocated based on the SDU specified by the user. The negotiated SDU could be considerably lower. The
difference between these two is wasted.
For example, the dispatcher specifies an SDU of 32k. Clients, by default, use an SDU of 8k. The remaining 24k is never
used.
Issue in Bug 6907529 is fixed in 11.2.
Bug 5410481 is fixed in 10.2.0.3.
As a workaround to 5410481, the ADDRESS part of DISPATCHERS parameter can be used to specify a smaller SDU size.
For example:
DISPATCHERS="(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp))(SDU=8192))"
To implement the change;
connect to the database as SYSDBA
alter system set dispatchers='(address=(protocol=tcp)(host=IP-Address)(sdu=8192))(dispatchers=DispatcherCount)' scope=spfile;
re-start the database
--//当然这个bug在11.2.0.4下已经不复存在.但是在共享服务器模式下,NETWORK BUFFER将被大量使用,我还第一次知道,我决定测试看看:
1.环境:
--//上班在11g的环境重复测试看看.
SCOTT@book> @ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
SCOTT@book> show parameter dispatchers
NAME TYPE VALUE
--------------- -------- -------------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=book,bookXDB)
max_dispatchers integer
SCOTT@book> show parameter shared_servers
NAME TYPE VALUE
------------------ -------- -----
max_shared_servers integer 1
shared_servers integer 1
SCOTT@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 65576
2.建立测试脚本:
$ cat b.sh
#!/bin/bash
for i in $(seq 100)
do
nohup sqlplus -s scott/book@192.168.100.78:1521/book:shared <<EOF > /dev/null 2>&1 &
select sysdate from dual ;
host sleep 60
quit;
EOF
done
3.测试:
SCOTT@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 477176
$ source b.sh
SCOTT@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 4628744
--//4628744-477176 = 4151568
--//4151568/100/1024 = 40.54kb
4.继续测试,修改SDU=32768.
--//修改sqlnet.ora加入,安装刘工文章介绍,最大32767.
DEFAULT_SDU_SIZE=32768
SCOTT@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
-------------------- ------------ ----------
NETWORK BUFFER shared pool 436016
$ source b.sh
SCOTT@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME POOL BYTES
--------------------- ------------ ----------
NETWORK BUFFER shared pool 16916464
--//16916464-436016 = 16480448
--//16480448/100/1024 = 160.94k
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.也会导致内存的消耗.
[20180926]共享池中的NETWORK BUFFER.txt的更多相关文章
- Oracle OCP之硬解析在共享池中获取内存锁的过程
转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/38684819 1.获得library cache Latch (1)在父游标的名柄没有找到 ...
- 使用DBMS_SHARED_POOL包将对象固定到共享池
使用DBMS_SHARED_POOL包将对象固定到共享池2011年06月24日 09:45:00 Leshami 阅读数:5808 版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处. htt ...
- O-理解共享池
我们可以通过show sga命令查看共享池的整体组成部分: ....待截图.... 一.SGA内存结构 Oracle中SGA主要包括: 1.固定数据结构部分(FIXED Size) 2.数据块缓冲区( ...
- ORACLE从共享池删除指定SQL的执行计划
Oracle 11g在DBMS_SHARED_POOL包中引入了一个名为PURGE的新存储过程,用于从对象库缓存中刷新特定对象,例如游标,包,序列,触发器等.也就是说可以删除.清理特定SQL的执行计划 ...
- 将指定SQL的执行计划从共享池删除的方法
如果Oracle的优化器产生了某种错误的执行计划,或者我们希望Oracle对于某个SQL重新进行分析,那么就需要这个SQL的执行计划在共享池中过期,而简单的方法在10.2.0.4以后才出现. 对于 ...
- Oracle 从共享池删除指定SQL的执行计划
ORACLE从共享池删除指定SQL的执行计划 2016-12-29 11:14 by 潇湘隐者, 2836 阅读, 0 评论, 收藏, 编辑 Oracle 11g在DBMS_SHARED_POOL包中 ...
- 十、dbms_shared_pool(提供了对共享池的一些过程和函数访问)
1.概述 作用:提供了对共享池的一些过程和函数访问,它使用户可以显示共享池中的对象尺寸,绑定对象到共享池,清除绑定到共享池的对象.为了使用该包,必须运行dbmspool.sql脚本来建立该包. 2.包 ...
- 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁
先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...
- [20180813]刷新共享池与父子游标.txt
[20180813]刷新共享池与父子游标.txt --//测试刷新共享池与父子游标含有那些信息保存在共享池.--//自己最近遇到的问题,感觉自己以前理解有点乱,测试看看. 1.环境SCOTT@book ...
随机推荐
- 正则表达式的一些探索(偏JavaScript)
简单的探索下正则表达式的相关知识,首先先了解下正则表达式的引擎和匹配过程区别,再试着掌握如何在场景中编写正则表达式,再然后探索下根据上文已知的原理和编写过程怎么去优化正则表达式,最后给出一些js里正则 ...
- DNS服务器的搭建
更详细的dns笔记整理: http://services.linuxpanda.tech/DNS/index.html 1 DNS介绍 DNS(Domain Name System,域名系统),因特网 ...
- Centos7安装MySQL8.0 - 操作手册
MySQL 8 正式版 8.0.11 已发布,官方表示 MySQL 8 要比 MySQL 5.7 快 2 倍,还带来了大量的改进和更快的性能! 一. Mysql8.0版本相比之前版本的一些特性 1) ...
- python 闯关之路四(下)(并发编程与数据库编程)
并发编程重点: 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别.互斥锁.信号. 事件.join.GIL.进程间通信.管道.队列. 生产者消息者模型.异步模 ...
- 翻译:man getopt(1)中文手册
NAME getopt - 解析命令行选项(加强版) SYNOPSIS getopt optstring parameters getopt [options] [--] optstring para ...
- Linux文件权限与属性详解 之 一般权限
目录 一般属性 1. iNode: 3152621 2. 文件类型 3.文件访问权限 4. 链接数目: 5. 文件所有者 6. 文件所属组 7. 文件大小 8. 修改时间 9. 文件名称 Linux文 ...
- 用python实现红包机制
方法一,逻辑是后一个红包的范围是[0.01,剩下的钱*2/剩下的红包数,如果最后钱不足分配给每个人,就把后几个每人分配0.01元. 主要思想就是,每个人至少能领取到0.01元. import rand ...
- [转]【docker】CMD ENTRYPOINT 区别
本文转自:https://blog.csdn.net/u010900754/article/details/78526443 昨天用Dockerfile来启动mongodb的集群,启动参数--repl ...
- C#基础知识总结(四)
摘要 循环结构的总结.跳转语句(break.continue).调试程序 一.循环结构的总结 1.while循环 ; ) { Console.WriteLine(i); i++; } 2.do-whi ...
- 分页Sql语句
第一种 Top剔除法.去除Top (pageIndex-1)*PageSize * FROM dbo.SBD_EXCHANGE_BILL ) EB_ID FROM dbo.SBD_EXCHANGE_B ...