在Oracle 12c,測試發現默認並不啟用AMM 特性,而是使用了ASMM。因為在X86 架構下的linux 平台中,配置hugepage時,也是需要關閉AMM,使用ASMM特性。
AMM分配內存的方式是在/dev/shm創文件的方式,每個文件大小為granule大小.這種方式和使用huge page的方式不兼容,所以使用huge page必須要禁掉amm.而使用asmm的方式,是使用傳統的共享內存方式.
在以前使用huge pages時,需要定義db_block_buffers來定義cache buffer使用huge page的數量.其他的內存組件是不能使用huge page的
現在新增加一個參數,use_large_pages,默認為true,oracle數據庫在啟動時,先會使用在os層面定義好的huge page數量然后再加上其他的內存,比如現在sga_target=定義了1500M,vm.nr_hugepages=200(MB),會先使用huge page,
再加上其他定義的1100M,這樣就避免了只有db_block_buffers使用huge page的情況.
[root@prod dbs]# cat /etc/sysctl.conf | grep vm
vm.nr_hugepages=40
[root@prod dbs]# cat /etc/security/limits.conf | grep memlock --要大於hugepage的size
# - memlock - max locked-in-memory address space (KB)
oracle soft memlock 5000000000
oracle hard memlock 5000000000
SQL> show parameter use_large_pages;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
use_large_pages string TRUE
這樣實例在啟動時,會用光所有可用的hugepage,不足的部分再按正常的內存去分配.
Wed Nov 13 04:01:36 2013
************************ Large Pages Information *******************
Wed Nov 13 04:01:36 2013
Per process system memlock (soft) limit = 4768 GB
Wed Nov 13 04:01:36 2013
Total System Global Area in large pages = 78 MB (9%)
Wed Nov 13 04:01:36 2013
Large pages used by this instance: 39 (78 MB)
Wed Nov 13 04:01:36 2013
Large pages unused system wide = 1 (2048 KB)
Wed Nov 13 04:01:36 2013
Large pages configured system wide = 40 (80 MB)
Wed Nov 13 04:01:36 2013
Large page size = 2048 KB
Wed Nov 13 04:01:36 2013
數據庫服務器內存設置——設置大葉內存
數據庫服務器的操作系統內核啟動大葉內存選項
大葉是2M一個頁,默認 是4k一個頁
如果數據庫連接數很多,每個連接又要訪問大量的數據,每個連接對應的進程都要在內存里分空間來存放它所要訪問的內存地址映射表,如果這樣的進程太多的話,可能會吃掉很多內存
每1G內存所需要的映射表的大小是2.5M,用大葉內存的話只用不到1M
$cat /etc/sysctl.conf | grep huge
vm.nr_hugepages = 45000
$cat /proc/meminfo | grep Huge
HugePages_Total: 45000
HugePages_Free: 6539
HugePages_Rsvd: 4548
HugePages_Surp: 0
Hugepagesize: 2048 kB
機器的連接數?
[oracle@prod ~]$ ps -ef | grep oracle | grep "LOCAL=NO"|wc -l
522
大致估算一下,64位系統下,一個進程如果要在數據庫中訪問1G數據的話,需要在內存中分配2M的內存,32位的系統需要1M
所以可以計算一下,522個會話,每個會話是一個進程,如果每個進程訪問1G的數據的話,操作系統需要500*2, 大約是1G的內存來為這些進程創建映射表
當前正在被使用的映射表占用的內存大小
[oracle@prod ~]$ cat /proc/meminfo | grep PageTable
PageTables: 6383288 kB
當前操作系統內存用於存映射表的大小:6G。
說明如果不開大葉內存的情況下,調整sga的話,至少需要給系統留出來這些內存,否則系統可能因為內存耗盡
也就是我這個物理內存64G,不開大葉內存的情況下,至少留個系統6G多。
按照計算,1個進程如果訪問1G數據的話需要2M左右的內存做為映射表,這個機器上有522個會話,映射表總大小是6G,
說明每個會話平均訪問的數據量是5.8G左右
所以調整sga的時候注意一下,記得給操作系統留出足夠的內存