[20190306]共用服務模式與SDU.txt

来源:https://www.cnblogs.com/lfree/archive/2019/03/07/10488570.html
-Advertisement-
Play Games

[20190306]共用服務模式與SDU.txt--//一些文檔提到共用服務模式,服務端SDU=65535,測試驗證看看.--//鏈接:https://blogs.sap.com/2013/02/07/oracle-sqlnet-researching-setting-session-data-un ...


[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/[email protected]:1521/book:DEDICATED
[email protected]: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,使用專用連接.

[email protected]:1521/book:DEDICATED> @ e1.txt  67
no rows selected

[email protected]:1521/book:DEDICATED> @e2.txt
SYSDATE
-------------------
2019-03-06 16:51:42

[email protected]: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/[email protected]:1521/book:shared
[email protected]: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

[email protected]:1521/book:shared> @ e1.txt 261
no rows selected

[email protected]:1521/book:shared> @ e2.txt
SYSDATE
-------------------
2019-03-06 16:55:46

[email protected]: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位元組,重覆測試看看:

[email protected]:1521/book:shared> @ e1.txt 261
no rows selected

[email protected]:1521/book:shared> @ e2.txt
SYSDATE
-------------------
2019-03-06 16:58:13

[email protected]: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/[email protected]: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/[email protected]: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.最後註意收尾.
--//取消修改設置為預設值.略.


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • MySQL學習之路(一) 1.1MySQL的概述 MySQL由瑞典MySQL AB公司開發,目前屬於Oracle公司。 MySQL是一個開源的關係型資料庫管理系統。 MySQL分為社區版和企業版。 1.2MySQL的安裝與配置 1.2.1 安裝方式: msi(推薦)和zip; 1.2.2MySQL目 ...
  • 眾所周知,InnoDB使用的索引結構是B+樹,但其實它還支持另一種索引:自適應哈希索引。 哈希表是數組+鏈表的形式。通過哈希函數計算每個節點數據中鍵所對應的哈希桶位置,如果出現哈希衝突,就使用拉鏈法來解決。更多內容可以參考 百度百科-哈希表 從以上可以知道,哈希表查找最優情況下是查找一次.而Inno ...
  • 抓取智聯招聘和百度搜索的數據併進行分析,使用visual studio編寫代碼mongodb和SQLServer存儲數據。使用scrapy框架結合 selenium爬取百度搜索數據,併進行簡要的數據的分析!! 爬取前的頁面分析: 打開百度搜索頁面,並查看網頁源代碼,問題便出現,無法查看到頁面源代碼, ...
  • MySQL apache公司 開源共用 免費 mysql [-hlocalhost] -uroot -p 以超級管理員的身份登錄 use demo; 查看 DCL(資料庫控制語言): DDL(資料庫定義語言): DML(資料庫操縱語言): DQL(資料庫查詢語言): TCL(事務控制語言): 資料庫 ...
  • 在psql中往往我們需要設置一個自增的主鍵id欄位,psql中不像SQL Server那樣點選 打鉤傻瓜式就能設置好的,是需要創建序列的:CREATE SEQUENCE,關鍵字SEQUENCE。 我們先看看創建過後的結果: (用的Navicat工具) 我們可以看到設置自增後欄位預設:nextval( ...
  • 今天給既有Windows Cluster 添加節點時,驗證總是不通過。報錯信息為 防火牆未正確配置為故障轉移群集。現將處理步驟彙總如下。 1.錯誤具體信息 報錯的位置 --【驗證警告】 的步驟中發現錯誤 驗證發現故障,主要是說網路驗證時發現問題。此時,不能再進行下一步了。 打開生成的故障轉移集群驗證 ...
  • 安裝mysql的時候一直出現這個問題,在網上找了很多種方法,終於解決了這個問題。 我在官網下載的安裝包解壓後沒有my.ini文件,需要自己添加(紅字不要複製) [mysql]# 設置mysql客戶端預設字元集default-character-set=utf8[mysqld]# 設置3306埠po ...
  • 這是我們開啟了bin-log, 我們就必須指定我們的函數是否是1 DETERMINISTIC 不確定的2 NO SQL 沒有SQl語句,當然也不會修改數據3 READS SQL DATA 只是讀取數據,當然也不會修改數據4 MODIFIES SQL DATA 要修改數據5 CONTAINS SQL ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...