[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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...