[20190306]共享服务模式与SDU.txt

--//一些文档提到共享服务模式,服务端SDU=65535,测试验证看看.
--//链接:https://blogs.sap.com/2013/02/07/oracle-sqlnet-researching-setting-session-data-unit-sdu-size-and-how-it-can-go-wrong/
Official Oracle 11g R2 documentation

Under typical database configuration, Oracle Net encapsulates data into buffers the size of the session data unit (SDU)
before sending the data across the network. Oracle Net sends each buffer when it is filled, flushed, or when an
application tries to read data. Adjusting the size of the SDU buffers relative to the amount of data provided to Oracle
Net to send at any one time can improve performance, network utilization, and memory consumption. When large amounts of
data are being transmitted, increasing the SDU size can improve performance and network throughput.

The amount of data provided to Oracle Net to send at any one time is referred to as the message size. Oracle Net assumes
by default that the message size will normally vary between 0 and 8192 bytes, and infrequently, be larger than 8192
bytes. If this assumption is true, then most of the time, the data is sent using one SDU buffer.

The SDU size can range from 512 bytes to 65535 bytes. The default SDU for the client and a dedicated server is 8192
bytes. The default SDU for a shared server is 65535 bytes.

The actual SDU size used is negotiated between the client and the server at connect time and is the smaller of the
client and server values. Configuring an SDU size different from the default requires configuring the SDU on both the
client and server computers, unless you are using shared servers. For shared servers, only the client value must be
changed because the shared server defaults to the maximum value.
--//注意理解最后一段: For shared servers, only the client value must be changed because the shared server defaults to
--//the maximum value.也就是在共享服务器模式下服务端SDU设置65535,以client端要设置为准,我开始理解错误.
--//实际上服务端应该也是可以改变的,修改dispatchers参数.

1.环境:
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

--//在client建立sql脚本e2.txt:
R:\>cat e1.txt
select sysdate,P2,TIME_SINCE_LAST_WAIT_MICRO from V$SESSION_WAIT_HISTORY where sid=&&1 and event='SQL*Net more data from client';

R:\> cat e2.txt
select /*
0014567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
0024567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
...snip...
5994567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
6004567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
*/ sysdate
from dual;

R:\>ls -l  e2.txt
-rw-rw-rw-   1 user     group       61235 Mar  6 16:46 e2.txt

--//说明服务端监听配置以及sqlnet.ora采用缺省配置SDU.
--//修改client端sqlnet.ora加入DEFAULT_SDU_SIZE=65535
R:\>grep -i sdu E:\app\oracle\product\12.2.0\dbhome_1\network\admin\sqlnet.ora
DEFAULT_SDU_SIZE=65535

2.测试1:
--//首先测试专用模式:
R:\>sqlplus scott/book@192.168.100.78:1521/book:DEDICATED
SCOTT@192.168.100.78:1521/book:DEDICATED> @ spid
 SID    SERIAL# PROCESS                  SERVER    SPID  PID  P_SERIAL# C50
---- ---------- ------------------------ --------- ----- --- ---------- --------------------------------------------
  67         73 12224:12764              DEDICATED 13418  29         30 alter system kill session '67,73' immediate;

--//sid=67,使用专用连接.

SCOTT@192.168.100.78:1521/book:DEDICATED> @ e1.txt  67
no rows selected

SCOTT@192.168.100.78:1521/book:DEDICATED> @e2.txt
SYSDATE
-------------------
2019-03-06 16:51:42

SCOTT@192.168.100.78:1521/book:DEDICATED> @ e1.txt  67
SYSDATE                     P2 TIME_SINCE_LAST_WAIT_MICRO
------------------- ---------- --------------------------
2019-03-06 16:51:48         64                          5
2019-03-06 16:51:48        229                          5
2019-03-06 16:51:48        138                          7

--//你可以发现会话出现SQL*Net more data from client等待事件,而且出现3次(注V$SESSION_WAIT_HISTORY视图记录遇到的最后10个等
--//待事件),这是因为sql语句超长,而我客户端设置DEFAULT_SDU_SIZE=65535,但是服务端SDU缺省是8192,这样协调选择最小的SDU值.

3.测试2:
--//测试共享模式:
R:\>sqlplus scott/book@192.168.100.78:1521/book:shared
SCOTT@192.168.100.78:1521/book:shared> @ spid
 SID    SERIAL# PROCESS                  SERVER    SPID  PID  P_SERIAL# C50
---- ---------- ------------------------ --------- ----- --- ---------- ---------------------------------------------
 261         31 12988:8108               SHARED    59542  20          1 alter system kill session '261,31' immediate;
--//sid=261

SCOTT@192.168.100.78:1521/book:shared> @ e1.txt 261
no rows selected

SCOTT@192.168.100.78:1521/book:shared> @ e2.txt
SYSDATE
-------------------
2019-03-06 16:55:46

SCOTT@192.168.100.78:1521/book:shared> @ e1.txt 261
no rows selected
--//可以发现在采用共享服务连接模式,执行脚本大小61K,并没有出现SQL*Net more data from client等待事件.说明这种情况下SDU确实
--//设置很大.

R:\>ls -l e2.txt
-rw-rw-rw-   1 user     group       67355 Mar  6 16:57 e2.txt
--//增加e2.txt 大小大于65535字节,重复测试看看:

SCOTT@192.168.100.78:1521/book:shared> @ e1.txt 261
no rows selected

SCOTT@192.168.100.78:1521/book:shared> @ e2.txt
SYSDATE
-------------------
2019-03-06 16:58:13

SCOTT@192.168.100.78:1521/book:shared> @ e1.txt 261
SYSDATE                     P2 TIME_SINCE_LAST_WAIT_MICRO
------------------- ---------- --------------------------
2019-03-06 16:58:15         31                        126

--//当脚本大小变大时,出现'SQL*Net more data from client'等待事件.

4.疑问:
--//自己觉得好奇的是oracle为什么这样设置,这样设置有什么好处.如果设置很大,使用共享模式消耗NETWORK BUFFER不是很大吗?
--//共享池不是要设置很大吗?
--//参考链接:http://blog.itpub.net/267265/viewspace-2214856/.

--//重新测试:
--//修改服务端的sqlnet.ora,DEFAULT_SDU_SIZE=65535
$ grep -i sdu /u01/app/oracle/product/11.2.0.4/dbhome_1/network/admin/sqlnet.ora
DEFAULT_SDU_SIZE=65535
#DEFAULT_SDU_SIZE=32767

$ cat /home/oracle/xxx430/testh/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 30
quit;
EOF
done

SYS@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME                 POOL              BYTES
-------------------- ------------ ----------
NETWORK BUFFER       shared pool       73808

$ . /home/oracle/xxx430/testh/b.sh

SYS@book> select name,pool,bytes from v$sgastat where name like '%NETWORK%';
NAME                 POOL              BYTES
-------------------- ------------ ----------
NETWORK BUFFER       shared pool    33292408
--//33292408/1024/1024 = 31.75M

SYS@book> select (33292408-73808)/100 from dual;
(33292408-73808)/100
--------------------
              332186

--//332186/1024= 324.4K.每个连接消耗324K. 332186/65535 = 5.06883344777599755855,5个SDU???
--//另外我在10g下做了测试10g下好像sdu最大32767.

--//好奇心测试看看SDU不同的情况下NETWORK BUFFER的消耗,方法如下:
1.修改SDU值
2.查询select name,pool,bytes from v$sgastat where name like '%NETWORK%';,记下bytes数量
3.执行$ seq 100 | xargs -I{} -P 100 bash -c 'sqlplus -s scott/book@192.168.100.78:1521/book:shared <<< "host sleep 20" '
4.查询select name,pool,bytes from v$sgastat where name like '%NETWORK%';,记下bytes数量
5.重复测试

--//画一个表格:
SDU    开始NETWORK BUFFER   结束NETWORK BUFFER  差值                          差值/100/SDU
-------------------------------------------------------------------------------------------------------------------------
10000  3344376               8399608            8399608-3344376 = 5055232     5055232/100/10000 = 5.05523200000000000000
20000  3344376               13399584     13399584-3344376 = 10055208    10055208/100/20000 = 5.02760400000000000000
30000  3344376               18399728          18399728-3344376 = 15055352    15055352/100/30000 = 5.01845066666666666666
40000  3344376               23399600          23399600-3344376 = 20055224    20055224/100/40000 = 5.01380600000000000000
50000  3344376               28399784          28399784-3344376 = 25055408    25055408/100/50000 = 5.01108160000000000000
60000  3344376               33400168          33400168-3344376 = 30055792    30055792 /100/60000 = 5.00929866666666666666
65535  3344376               36167632          36167632-3344376 = 32823256    32823256/100/65535 = 5.00850782024872205691
70000  3344376               36167760          36167760-3344376 = 32823384    32823384/100/5 = 65646.76800000000000000000
---------------------------------------------------------------------------------------------------------------------------
--//注:最后SUD设置70000,实际上协调2者SDU=65535.
--//按照http://www.askmaclean.com/archives/%E5%85%B1%E4%BA%AB%E6%B1%A0%E4%B8%AD%E7%9A%84network-buffer.html的理解:
为什么共享服务器模式下会用到共享池中的NETWORK BUFFER,而独享服务器模式下没有呢?因为在独享服务器模式下每个会话所分配的三
个SDU是从PGA中获取的;当使用共享服务器模式时会话与服务进程形成一对多的映射关系,这三个SDU 的NETWORK BUFFER同UGA一样转移
到了SGA中。

--//可不可这样理解实际上不是3个SDU,而是5个呢?不知道我的理解是否正确.不过我在10g测试情况不同:

SYS@test> @ &r/ver1
PORT_STRING                    VERSION        BANNER
------------------------------ -------------- ----------------------------------------------------------------
x86_64/Linux 2.4.xx            10.2.0.4.0     Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

SDU    开始NETWORK BUFFER   结束NETWORK BUFFER  差值                          差值/100/SDU
-------------------------------------------------------------------------------------------------------------------------
10000  139824               12025456            12025456-139824 = 11885632    11885632/100/10000 = 11.88563200000000000000
20000  139824               14025456            14025456-139824 = 13885632    13885632/100/20000 = 6.94281600000000000000
30000  139824               16025424            16025424-139824 = 15885600    15885600/100/30000 = 5.29520000000000000000
32767  139824               16579040            16579040-139824 = 16439216    16439216/100/32767 = 5.01700369273964659566
40000  139824               16579024            16579024-139824 = 16439200    16439200/32767/100 = 5.01699880977813043610
-------------------------------------------------------------------------------------------------------------------------

--//可以看出10g SDU最大是32767.
--//后面的差值/100/SDU很大时才接近5个SDU.

5.最后注意收尾.
--//取消修改设置为缺省值.略.

[20190306]共享服务模式与SDU.txt的更多相关文章

  1. [20180316]共享服务模式和直接路径读.txt

    [20180316]共享服务模式和直接路径读.txt --//在共享服务器模式下,执行计划不会选择直接路径读,通过例子证明. 1.环境:SYS@book> @ &r/ver1PORT_S ...

  2. [20191113]oracle共享连接模式端口2.txt

    [20191113]oracle共享连接模式端口2.txt --//昨天的测试链接:http://blog.itpub.net/267265/viewspace-2663651/=>[20191 ...

  3. [20191112]oracle共享连接模式端口.txt

    [20191112]oracle共享连接模式端口.txt --//如果使用共享服务模式,你可以发现每次重启数据库对应的端口号会发生变化.# netstat -tunlp | egrep "A ...

  4. 分布式系统的消息&服务模式简单总结

    分布式系统的消息&服务模式简单总结 在一个分布式系统中,有各种消息的处理,有各种服务模式,有同步异步,有高并发问题甚至应对高并发问题的Actor编程模型,本文尝试对这些问题做一个简单思考和总结 ...

  5. 002-读书笔记-企业IT架构转型之道-阿里巴巴中台战略思想与架构实战-第二章 构建业务中台的基础-共享服务体系简介

    2.1.回归SOA的本质-服务重用 SOA理念的核心价值:松耦合的服务带来业务的复用,通过服务的编排助力业务的快速响应和创新. 现有模式多是烟囱式结合 ESB 企业总线打通不同系统间的交互. 2.2. ...

  6. hive使用derby的服务模式(可以远程模式)

    hive默认使用的derby的嵌入模式.这个就面临着,无法多个并发hive shell共享的问题. 使用MySQL服务器也可以解决问题,但安装.配置太麻烦了. 可以使用轻量级的derby的c/s服务模 ...

  7. 基于云计算的IaaS、PaaS、SaaS三种服务模式的区别

    Infrastructure-as-a-Service(IaaS) - 基础即设施服务 基础设施主要包括网络系统(networking).存储设备(storage).服务器(servers).虚拟化技 ...

  8. 云计算服务模式(SaaS/PaaS/IaaS)

    为什么是云计算,为什么是现在 商用云:商用云的设计初衷是将基础设施商品化,并以较低的成本对外提供,是用户能够获得高扩展性和自服务能力. 企业云:企业级云的目的,则是达到或超过它所要替代的本地基础设施的 ...

  9. 公共卫生GIS共享服务平台

    1   系统详细设计 1.1 GIS共享服务管理 1.1.1 概述 GIS共享服务管理是本系统的重要组成部分,它实现了对各类地图数据.业务资源数据的集成统一管理,提供了一个平台级的管理解决方案,能够往 ...

随机推荐

  1. ⑧javaWeb之在例子中学习(过滤器Filter)

    前言 本系列 Servlet & JSP 学习系列[传送门]逐渐到了中期了,希望大家喜欢我写的,总结的点点滴滴- 今天我们来讲讲过滤器 你们的支持是我写博客的动力哦. 最近买了两本书,觉得大二 ...

  2. ADO.NET的整理

    ADO.NET的几个对象 Connection:管理数据库的连接 Command:对数据库执行命令 DataReader:数据流读取器,返回的数据都是快速的且只是“向前”的数据流.无法实例化,只能通过 ...

  3. linux命令-awk入门

    最近经常查看nginx日志,有时候需要做一些统计分析,于是就想起了awk,学习了就顺便做一个记录. 目录 概述:简单介绍awk背景原理 基本用法:常用到的awk语法 内建变量 综合实例 概述 awk是 ...

  4. SLAM入门之视觉里程计(3):两视图对极约束 基础矩阵

    在上篇相机模型中介绍了图像的成像过程,场景中的三维点通过"小孔"映射到二维的图像平面,可以使用下面公式描述: \[ x = MX \]其中,\(c\)是图像中的像点,\(M\)是一 ...

  5. 项目实战1—LNMP的搭建、nginx的ssl加密、身份验证的实现

    总项目流程图,详见 http://www.cnblogs.com/along21/p/8000812.html 实战一:搭建lnmp及类小米等商业网站的实现 环境:关闭防火墙,selinux 1.安装 ...

  6. [CF286E] Ladies' shop

    Description 给出 \(n\) 个 \(\leq m\) 且不同的数 \(a_1,\dots,a_n\),现在要求从这 \(n\) 个数中选出最少的数字,满足这 \(n\) 个数字都可以由选 ...

  7. 数据库性能测试:sysbench用法详解

    1.简介和安装 sysbench是一个很不错的数据库性能测试工具. 官方站点:https://github.com/akopytov/sysbench/ rpm包下载:https://packagec ...

  8. haproxy(8):haproxy代理MySQL要考虑的问题

    HaProxy系列文章:http://www.cnblogs.com/f-ck-need-u/p/7576137.html haproxy可以通过 TCP协议 来代理MySQL.但是两个问题必须考虑: ...

  9. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  10. html中的Session

    采用setItem()方法存储 sessionStorage.setItem('testKey','这是一个测试的value值'); // 存入一个值sessionStorage.getItem('t ...