[201804012]關於hugepages 3.txt

来源:https://www.cnblogs.com/lfree/archive/2018/04/13/8818575.html
-Advertisement-
Play Games

[201804012]關於hugepages 3.txt--//有一段時間我一直強調安裝oracle一定要配置hugepage,因為現在的伺服器記憶體越來越大,如果還使用4K的頁面表,如果記憶體表占用記憶體巨大,--//特別連接數量很大的情況下,更加明顯,結果導致記憶體緊張,使用交換,這些類似的例子網上很多 ...


[201804012]關於hugepages 3.txt

--//有一段時間我一直強調安裝oracle一定要配置hugepage,因為現在的伺服器記憶體越來越大,如果還使用4K的頁面表,如果記憶體表占用記憶體巨大,
--//特別連接數量很大的情況下,更加明顯,結果導致記憶體緊張,使用交換,這些類似的例子網上很多.
--//鏈接:
http://blog.itpub.net/267265/viewspace-2128811/=>[20161121]關於使用hugepage的討論.txt
http://blog.itpub.net/267265/viewspace-2134900/=>[20170308]再談hugepages.txt

--//感覺我第2次測試,可能沒有排除直接路徑讀干擾,1:3效果不是很明顯,我決定重覆測試看看

1.環境:
SCOTT@book> @ &r/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> create table t as select rownum id from dual connect by level<=2;
Table created.

SCOTT@book> ALTER TABLE t MINIMIZE RECORDS_PER_BLOCK ;
Table altered.
--//這樣可以實現每塊2條記錄.

SCOTT@book> insert into t select rownum+2 from dual connect by level <=64000-2;
63998 rows created.

SCOTT@book> commit ;
Commit complete.

SYS@book> create pfile='/tmp/@.ora' from spfile;
File created.

--//重啟資料庫:
SYS@book> startup  pfile='/tmp/book.ora';
ORACLE instance started.
Total System Global Area  634732544 bytes
Fixed Size                  2255792 bytes
Variable Size             197133392 bytes
Database Buffers          427819008 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.

SYS@book> show sga
Total System Global Area    634732544 bytes
Fixed Size                    2255792 bytes
Variable Size               197133392 bytes
Database Buffers            427819008 bytes
Redo Buffers                  7524352 bytes

2.測試說明:
--//首先說一下我的想法,如果執行計划走直接路徑讀,相關數據塊並沒有進入緩存,這樣測試使用pagesizes的結果就不包括這部分.
--//這樣執行計划走直接路徑讀與不走直接路徑讀的比較就是這部分緩存使用pagesizes.

--//建立測試連接的執行腳本
$ cat b.sh
#!/bin/bash
grep -i page /proc/meminfo
echo
for i in $(seq 100)
do
nohup        sqlplus -s scott/book <<EOF > /dev/null 2>&1 &
variable a number;
exec :a := 0;
alter session set "_serial_direct_read"=never;
select count(*) from t where 1=:a;
host sleep 10
commit;
quit;
EOF
done
echo sleep 5s
sleep 5
echo
grep -i page /proc/meminfo

3.測試使用hugepages的情況:

--// 執行b.sh腳本,exec :a := 0;
$ . b.sh
AnonPages:        348784 kB
PageTables:        63448 kB
AnonHugePages:         0 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:      201
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        983640 kB
PageTables:       118716 kB
AnonHugePages:         0 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:      201
Hugepagesize:       2048 kB

--//條件1=0,不用訪問表
--//說明:開啟100個會話,僅僅執行select count(*) from t where 1=:a;頁面表
--//從63448kb變化到 118716kB. 118716-63448 = 55268,每個會話消耗550K.
--//這個是我以前測試沒有註意的問題.

--//修改b.sh換成exec :a := 1;訪問表之外,與前面沒有區別:
--// 執行b.sh腳本,exec :a := 0;
$ . b.sh
AnonPages:        348788 kB
PageTables:        63404 kB
AnonHugePages:         0 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:      201
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        983548 kB
PageTables:       118948 kB
AnonHugePages:         0 kB
HugePages_Total:     305
HugePages_Free:        3
HugePages_Rsvd:        3
HugePages_Surp:      201
Hugepagesize:       2048 kB

--//你可以對比發現2個差距不大,使用hugepages後,訪問表與不訪問表PageTables的變化很小.

4.測試不使用hugepages的情況:
--//重啟資料庫./tmp/book.ora 參數修改不使用hugepages看看.
--//*.use_large_pages='FALSE'

SYS@book> startup  pfile='/tmp/book.ora';
ORACLE instance started.
Total System Global Area  634732544 bytes
Fixed Size                  2255792 bytes
Variable Size             197133392 bytes
Database Buffers          427819008 bytes
Redo Buffers                7524352 bytes
Database mounted.
Database opened.

SYS@book> show parameter use_large_pages
NAME            TYPE   VALUE
--------------- ------ ------
use_large_pages string FALSE

--// 執行b.sh腳本,exec :a := 0;
$ . b.sh
AnonPages:        265200 kB
PageTables:        63952 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        905808 kB
PageTables:       148476 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
--//說明:開啟100個會話,僅僅執行select count(*) from t where 1=:a;頁面表
--//從63952kb變化到148476 kB. 148476-63952 = 84524 kb,每個會話消耗840K.但是前面使用hupages每個會話僅僅消耗550K,
--//這樣如果會話很多累積起來差別還是很大的.

--// 執行b.sh腳本,exec :a := 1;
$ . b.sh
AnonPages:        268096 kB
PageTables:        64276 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        904432 kB
PageTables:       215188 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//你可以發現訪問表與不訪問表,PageTables變化148476 kB =>215188 kB.存在很大差距.

--//以下計算存在很大偏差,不過還是能說明問題:

--//(215188-64276)-(148476-63952) = 66388,使用hugepages,訪問表頁面表增加66388.
--//(118948-63404)-(118716-63448) = 276,  不使用hugepages,訪問表頁面表增加276.

--//66388/276 = 240.53623188405797101449
--//可以發現對比訪問數據與不訪問數據,hugepages存在240倍差距.當然我這樣計算誤差很大.哈哈也不知道這樣算是否有問題.

--//我的資料庫使用手工管理記憶體,全部參數手工設置,這樣記憶體的分配是連續.看看記憶體分配情況.參考鏈接:http://blog.itpub.net/267265/viewspace-2136689/

SYS@book> @ &r/memalloc

MIN(BASEADDR)    MAX(BASEADDR)      GRANULES         MB  GRANFLAGS COMPONENT                        GRANSTATE
---------------- ---------------- ---------- ---------- ---------- -------------------------------- ----------------
0000000060C00000 000000007A000000        102        408          4 DEFAULT buffer cache             ALLOC
000000007A400000 000000007A400000          1          4          4 java pool                        ALLOC
000000007A800000 000000007B000000          3         12          4 large pool                       ALLOC
000000007B400000 0000000085C00000         43        172          4 shared pool                      ALLOC

SYS@book> show parameter db_cache_size
NAME          TYPE        VALUE
------------- ----------- ------
db_cache_size big integer 408M

--//gransize=4*1024*1024=4194304
--//4194304 = 0x400000
--//0x7A400000+0x400000= 0x7A400000
--//可以看出緩存分配範圍0x0000000060C00000-0x000000007A400000.
--//轉換10進位 0x60C00000=1623195648, 0x7A400000=2051014656.
SYS@book> select OBJECT_ID,DATA_OBJECT_ID from dba_objects where owner='SCOTT' and object_name='T';

 OBJECT_ID DATA_OBJECT_ID
---------- --------------
     90610          90610

SELECT xx, COUNT (*)
    FROM (SELECT ROUND ( (TO_NUMBER (ba, 'xxxxxxxxxxxxxxxxxxxxxx') - 1623195648) / (2 * 1024 * 1024) ,0) xx
            FROM x$bh
           WHERE obj = 90610 AND state <> 0)
GROUP BY rollup(xx)
ORDER BY xx;

        XX   COUNT(*)
---------- ----------
        27         18
        29         44
        31        120
        32         21
        33        153
        34         50
        35        172
        36        106
        37        208
        38        204
        39        256
        40        227
        41        256
        42        230
        43        256
        44        234
        45        256
        46        234
        47        256
        48        234
        49        256
        50        234
        51        256
        52        234
        53        256
        54        234
        55        256
        56        234
        57        256
        58        234
        59        256
        60        234
        61        256
        62        234
        63        256
        64        234
        65        256
        66        234
        67        256
        68        234
        69        256
        70        234
        71        256
        72        234
        73        256
        74        234
        75        256
        76        234
        77        256
        78        234
        79        256
        80        234
        81        256
        82        234
        83        256
        84        234
        85        256
        86        234
        87        256
        88        234
        89        256
        90        234
        91        256
        92        234
        93        256
        94        234
        95        256
        96        234
        97        256
        98        234
        99        256
       100        234
       101        256
       102        234
       103        256
       104        234
       105        256
       106        234
       107        256
       108        234
       109        256
       110        234
       111        256
       112        234
       113        256
       114        234
       115        256
       116        234
       117        256
       118        234
       119        256
       120        234
       121        256
       122        234
       123        256
       124        234
       125        256
       126        234
       127        256
       128        234
       129        256
       130        234
       131        256
       132        234
       133        256
       134        234
       135        256
       136        232
       137        256
       138        234
       139        256
       140        234
       141        256
       142        234
       143        256
       144        234
       145        256
       146        234
       147        256
       148        234
       149        256
       150        234
       151        256
       152        234
       153        256
       154        234
       155        256
       156        234
       157        256
       158        234
       159        256
       160        234
       161        256
       162        234
       163        220
       164        200
       165         88
       166         81
       167         10
                32062

140 rows selected.
--//頁面表占用139項(如果使用hugepages).占用數據塊數 32062.
--//如果使用4k的頁面表.32062*8192/4096  = 64124.
--//64128/139  = 461.35251798561151079136.為什麼不是前面計算240被.
--//如果你仔細看查詢x$bh輸出,就可以發現問題,我資料庫重啟後(不使用hugepages)看到的數據分佈,它全部集中在前面.
--//而我前面使用hugepages時機器很長時間沒有關閉資料庫,我估計數據會均勻分佈在這個數據緩存,這樣我的測試環境
--//db_cache_size=408M,這樣頁面表應該接近204項.
--//64128/204 = 314.35294117647058823529,還是存在很大誤差.或許我這樣計算存在問題...^_^.

5.測試不使用hugepages的情況,建立索引的情況呢?
SCOTT@book> alter table t modify (id not null);
Table altered.

SCOTT@book> create index i_t_id on t(id);
Index created.

--// 執行b.sh腳本,exec :a := 0;
$ . b.sh
AnonPages:        282884 kB
PageTables:        67876 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        918952 kB
PageTables:       152108 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--// 執行b.sh腳本,exec :a := 1;
$ . b.sh
AnonPages:        282840 kB
PageTables:        67860 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        917564 kB
PageTables:       159184 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//可以建立索引後,執行計划走索引全 INDEX FAST FULL SCAN.這樣訪問的塊明顯減少.
--//對比PageTables使用記憶體變化也不是很大,從另外一個訪問也說明一個問題,當應該優化不好PageTables占用空間也會很大.
--//當轉換使用hugepages直接把問題掩蓋起來.

5.測試不使用hugepages的情況,訪問表走直接路徑讀的情況呢?

--//清除數據緩存.
SYS@book> alter system flush buffer_cache;
System altered.

--// 修改腳本註解alter session set "_serial_direct_read"=never;.
$ cat b.sh
#!/bin/bash
grep -i page /proc/meminfo
echo
for i in $(seq 100)
do
nohup        sqlplus -s scott/book <<EOF > /dev/null 2>&1 &
variable a number;
exec :a := 0;
--//alter session set "_serial_direct_read"=never;
Select count(*) from t where 1=:a;
host sleep 10
commit;
quit;
EOF
done
echo sleep 5s
sleep 5
echo
grep -i page /proc/meminfo

--//執行b.sh腳本,exec :a := 0;
$ . b.sh
AnonPages:        280592 kB
PageTables:        68312 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:        917436 kB
PageTables:       155852 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//執行b.sh腳本,exec :a := 1;
$ . b.sh
AnonPages:        281504 kB
PageTables:        68348 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

sleep 5s

AnonPages:       1129404 kB
PageTables:       159832 kB
AnonHugePages:         0 kB
HugePages_Total:     104
HugePages_Free:      104
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//對比可以發現走直接路徑讀的情況下,PageTables基本沒有變化.

--//但願這個帖子能說明hugepage的好處.有許多錯誤希望大家指正...
--//以前寫的帖子問題多多,希望看我博客的朋友不要見怪..哈哈.



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

-Advertisement-
Play Games
更多相關文章
  • 由於SQL Server不常用,所以這裡只針對MySQL資料庫和Oracle資料庫的區別 (1) 對事務的提交 MySQL預設是自動提交,而Oracle預設不自動提交,需要用戶手動提交,需要在寫commit;指令或者點擊commit按鈕(2) 分頁查詢 MySQL是直接在SQL語句中寫"select ...
  • 本文內容: 什麼是視圖 創建視圖 查看視圖 視圖的修改 視圖的刪除 視圖的數據操作 首發日期:2018-04-13 什麼是視圖: 視圖是一種基於查詢結果的虛擬表,數據來源的表稱為基本表。 視圖的建立和刪除不影響基本表。 視圖的插入,修改操作會影響基本表。 如果視圖來自多個基本表,那麼不可以修改基本表... ...
  • 今天,正在開心的寫著代碼,突然多個人員反饋網站特別慢。 總結:一開始這個項目已經正常跑了一段時間了,不知道為什麼會突然出現這個問題。沒有深究,有知道的歡迎留言。 ...
  • https://www.cnblogs.com/xqzt/p/4482888.html ...
  • [20180413]熱備模式相關問題2.txt--//上午測試熱備模式相關問題,就是如果打開熱備模式,如果中間的歸檔丟失,oracle在alter database end backup ;時並沒有應用日誌.--//雖然熱備份模式文件頭scn被"凍結",一定在某個地方記錄的檢查點的scn,這樣在執行 ...
  • 業務量增長到一定程度後,簡單的主從架構已經不能滿足業務需要,主庫的讀寫壓力增大,逐漸達到瓶頸,這時引入主從讀寫分離是一個不錯的選擇。本文介紹了實現讀寫分離的一款工具---Amoeba。 ...
  • net start mysql 無法啟動 1.可以進入MySQL的bin目錄下 mysql --remove 2.檢查一下自己的my.ini是否配置正確 [mysqld] #basedir代表自己MySQL的安裝根目錄basedir = D:\MySQL\mysql-5.7 #datadir代表自己 ...
  • 一、概要參考:https://docs.mongodb.com/getting-started/python/client/pymongo是python操作mongodb數據的第三方模塊,官方推薦使用;使用pymongo之前,首先安裝pymongo模塊,命令如下(使用pip安裝):pip insta... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...