[20221212]關於pre_page_sga引數的問題.txt

lfree發表於2022-12-12

[20221212]關於pre_page_sga引數的問題.txt

--//別人遇到的問題,無法演示連結http://blog.itpub.net/267265/viewspace-2133260/=>[20170209]理解pre_page_sga引數.txt
--//我當時的測試設定pre_page_sga=true的情況,HugePages_Rsvd是0.
--//我看了一下實際上是對方sga_target設定問題導致的.透過例子說明:

1.環境:

$ cat initxxxx.ora
db_name=xxxx
instance_name=xxxx
sga_target=0G
sga_max_size=50G
shared_pool_size=2G
pre_page_sga=true
--//注意設定sga_target=0G

# grep "^vm.nr" /etc/sysctl.conf
vm.nr_hugepages = 26000
vm.nr_overcommit_hugepages = 1300

# sysctl -p
# sysctl vm.nr_hugepages
vm.nr_hugepages = 26000

# grep "^oracle" /etc/cur': grep "^oracle" /etc/security/limits.conf | grep memlock
oracle   soft  memlock  unlimited
oracle   hard  memlock  unlimited

$ egrep "Max locked memory|Limit" /proc/self/limits
Limit                     Soft Limit           Hard Limit           Units
Max locked memory         unlimited            unlimited            bytes

2.測試:
--//測試前:
# grep -i pages /proc/meminfo
AnonPages:        226424 kB
AnonHugePages:     57344 kB
HugePages_Total:   26000
HugePages_Free:    26000
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
--//沒有任何程式使用hugepages.

$ export ORACLE_SID=xxxx
SYS@xxxx> startup  nomount
ORACLE instance started.

Total System Global Area 5.3447E+10 bytes
Fixed Size                  2265864 bytes
Variable Size            5.3284E+10 bytes
Database Buffers          134217728 bytes
Redo Buffers               26480640 bytes

# grep -i pages /proc/meminfo
AnonPages:        286296 kB
AnonHugePages:     69632 kB
HugePages_Total:   26000
HugePages_Free:    24601
HugePages_Rsvd:    24202
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//可以發現當前僅僅使用了26000-24601 = 1399 ,相當於現在sga_target=1399 * 2M .
--//該例項如果全部使用應該是 26000-24601+24202 = 25601,相當於 50G+2M.

3.繼續:
$ cat initxxxx.ora
db_name=xxxx
instance_name=xxxx
sga_target=50G
sga_max_size=50G
shared_pool_size=2G
pre_page_sga=true
--//注意設定sga_target=50G

--//關閉資料庫例項xxxx.
--//測試前:
# grep -i pages /proc/meminfo
AnonPages:        217752 kB
AnonHugePages:     59392 kB
HugePages_Total:   26000
HugePages_Free:    26000
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

--//啟動資料庫例項xxxx.實際上這樣啟動比前面的啟動慢許多.
--//啟動例項後:
# grep -i pages /proc/meminfo
AnonPages:        286328 kB
AnonHugePages:     69632 kB
HugePages_Total:   26000
HugePages_Free:      473
HugePages_Rsvd:       74
HugePages_Surp:        0
Hugepagesize:       2048 kB
--//我不知道為什麼HugePages_Rsvd=74.
--//我測試前以為HugePages_Free=399,HugePages_Rsvd=0.
--//還是可以說明pre_page_sga=true的情況載入大部分sga到記憶體的hugepages中.

$ ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x00000000 68288514   oracle    640        268435456  18
0x00000000 68321283   oracle    640        53418655744 18
0x4fc32208 68354052   oracle    640        2097152    18

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x7e7c81d8 63602688   oracle    640        1004

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

--//(268435456  + 53418655744 + 2097152   )/2048/1024 = 25601

--//alert記錄如下:
************************ Large Pages Information *******************
Per process system memlock (soft) limit = UNLIMITED

Total Shared Global Region in Large Pages = 50 GB (100%)

Large Pages used by this instance: 25601 (50 GB)
Large Pages unused system wide = 399 (798 MB)
Large Pages configured system wide = 26000 (51 GB)
Large Page size = 2048 KB
********************************************************************

4.後記:
--//順便提一下采用hugepages是大勢所趨,現在伺服器配置記憶體都很高.而且12c開始pre_page_sga預設設定就是true.
--//還採用原來的方式會導致PageTables消耗很大的記憶體.
--//另外注意一點如果設定vm.nr_hugepages 很大,會導致記憶體的大量浪費,比sga_max_size大一點點就ok了.
--//測試完成修改/etc/sysctl.conf裡面的vm.nr_hugepages引數略.

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2927697/,如需轉載,請註明出處,否則將追究法律責任。

相關文章