記憶體_大頁記憶體
AMM ( memory_target<>0 )情況下不能使用大頁記憶體。
大頁記憶體說明:
分頁儲存管理,是將一個程式的邏輯地址空間分成若干個大小相等的片,稱為頁面或頁,併為各頁加以編號,從 開始,如第 頁、第 1 頁等,這些頁面或頁又是頁表的頁表項
頁表大小 = 頁表項個數 × 頁表項大小
下例中: 6000 個大頁,這 6000 個大頁就是 6000 個頁號,存放在頁表中就要佔用 6000 個頁表項,一個頁表項多大呢,就是多少位, 64 位系統就是 8B ,也就是 8 位元組, 6000 頁表項 *8 位元組 =48KB
在分頁系統中的頁面其大小應適中。頁面若太小,一方面雖然可使記憶體碎片減小,從而減少了記憶體碎片的總空間,有利於提高記憶體利用率,但另一方面也會使每個程式佔用較多的頁面,從而導致程式的頁表過長,佔用大量記憶體;此外,還會降低頁面換進換出的效率。然而,如果選擇的頁面較大,雖然可以減少頁表的長度,提高頁面換進換出的速度,但卻又會使頁內碎片增大。因此,頁面的大小應選擇得適中,且頁面大小應是 2 的冪,通常為 512 B~8 KB 。
頁表記憶體計算
在 32 位系統下,一個程式訪問 1GB 的記憶體,會產生 1M 的頁表,如果是在 64 位系統,將會增大到 2M 。 很容易推算,如果一個 SGA 設定為 60G ,有 1500 個 Oracle 使用者程式, 64 位 Linux 的系統上,最大的頁表佔用記憶體為: 60*2*1500/1024=175G ,是的,你沒看錯,是 175G !但是實際情況看到的頁表佔用可能沒有這麼大,打個百分之四五十的折扣,這是因為只有伺服器程式訪問到 SGA 的特定區域後,程式才需要把這一塊對應的頁表項加入到自己的頁表中。
大頁記憶體的作用
1 :減少頁表大小,一個大頁對應連續的 2M 記憶體, 12G 的記憶體只要 6000 個大頁,而原來需要 24M 頁表( 64 位系統一個使用者訪問 1G 需要 2M 的頁表, 2*12=24 ),現在只需要 48KB ( 64 位系統一個頁表項為 8Bytes ,因為 8bytes=64bit )
2 :大頁記憶體只能鎖定在實體記憶體中,不能交換到交換區,這樣就避免了交換引起的效能問題
3 :由於頁表的減少,使得 CPU 中的命中率大大提高
OS 層面檢視大頁使用情況
PageTables :頁表記憶體,耗記憶體 34M
HugePages_Total :大頁頁面數,和 Hugepagesize 相乘後得到所分配的記憶體大小。 43000*2/1024 大約為 84GB 。
HugePages_Free :從來沒有被使用過的大頁頁面數。即使 Oracle sga 已經分配了這部分記憶體,但是如果沒有實際寫入,那麼看到的還是 Free 的。這是很容易誤解的地方。
HugePages_Rsvd :已經被分配預留但是還沒有使用的大頁頁面數。在 Oracle 剛剛啟動時,大部分記憶體應該都是 Reserved 並且 Free 的,隨著 Oracle SGA 的使用, Reserved 和 Free 都會不斷的降低。
HugePages_Free – HugePages_Rsvd :這部分是沒有被使用到的記憶體,如果沒有其他的 Oracle instance ,這部分記憶體也許永遠都不會被使用到,也就是被浪費了。在該系統上有 11.5GB 的記憶體被浪費了。
Hugepagesize :表示每個大頁頁面對應的大小
HugePages_Total* Hugepagesize= 大頁記憶體的總量
比如大頁記憶體 hugepages 總計 11GB , sga_max_size 為 10G , sga_target 為 8G , DB 啟動後會根據 sga_max_size 分配 hugepages 記憶體,這裡為 10G ,真正 free 的 hugepages 記憶體為 11-10=1G ,但是 sga_target 為 8G ,那麼會有 2G 不被訪問,則 hugepages_free 為 2+1=3G , hugepage_Rsvd 記憶體有 2G ,這裡實際給其他例項使用的只有 1G ,也就是真正意義上的 free 只有 1G 。
到目前為止,大頁記憶體只能用於共享記憶體段等少量型別的記憶體。一旦將實體記憶體用作大頁記憶體,這些記憶體就不能用做其他用途,比如作為程式的私有記憶體,因此不能將過多的記憶體設定為大頁記憶體, 通常將大頁記憶體的頁數設定為:
Hugepage_total=ceil ( sga_max_size/hugepagesize ) +2
比如 SGA_MAX_SIZE=18G , hugepagesize=2048kb ,則大頁記憶體的頁數 =ceil(18*1024/2)+2=9218
配置大頁記憶體的方法
1. 檢視記憶體是否支援大頁記憶體,檢視 /proc/meminfo 是否有 PageTables 、 HugePages_Total 等項,如果沒有則需要在核心配置CONFIG_HUGETLBFS=y、CONFIG_HUGETLB_PAGE=y支援大記憶體頁
2. 修改 /etc/sysctl.conf 檔案,設定大頁記憶體的頁面數,增加如下,再執行 sysctl –p 使之生效,再檢查 /proc/meminfo 檢視 hugepages_total 如果小於設定的值,則說明沒有足夠的連續實體記憶體用於這些大頁記憶體,需要重啟伺服器使之生效
vm.nr_hugepages=9218
To determine the default large page size, run the following command:
# grep Hugepagesize /proc/meminfo
For example, if /proc/meminfo lists the large page size as 2 MB, and the total SGA size for the instance is 1.6 GB, then set the value for the vm.nr_hugepages kernel parameter to 820 (1.6 GB / 2 MB = 819.2).
3. 在 /etc/security/limits.conf 檔案中增加如下行 (oracle 使用者可以鎖定的記憶體大小,單位 KB)
oracle soft memlock 18878464
oracle hard memlock 18878464
Edit the memlock setting in the /etc/security/limits.conf file. The memlock setting is specified in KB and set slightly lesser than the installed RAM. For example, if you have 64GB RAM installed, add the following entries to increase the max locked memory limit:
* soft memlock 60397977
* hard memlock 60397977
You can also set the memlock value higher than your SGA requirements.
可能因為沒有配置大頁記憶體導致的故障現象
1. CPU100% ,但是 user% 不高,只是 sys% 非常高
2. /proc/meminfo 顯示 PageTables 頁表非常大好幾個 G
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2105962/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【大頁記憶體】Oracle資料庫配置大頁記憶體記憶體Oracle資料庫
- openGauss-大頁記憶體記憶體
- 遊戲記憶體對比普通記憶體區別 遊戲記憶體和普通記憶體相差大嗎?遊戲記憶體
- 探索MYSQL開啟大頁記憶體MySql記憶體
- Redis記憶體——記憶體消耗(記憶體都去哪了?)Redis記憶體
- 記憶體管理 記憶體管理概述記憶體
- 【記憶體管理】記憶體佈局記憶體
- Windows記憶體管理-分頁Windows記憶體
- Java的記憶體 -JVM 記憶體管理Java記憶體JVM
- Go:記憶體管理與記憶體清理Go記憶體
- 聊聊 記憶體模型與記憶體序記憶體模型
- linux記憶體管理(一)實體記憶體的組織和記憶體分配Linux記憶體
- 記憶體管理篇——實體記憶體的管理記憶體
- JS中的棧記憶體、堆記憶體JS記憶體
- Java記憶體區域和記憶體模型Java記憶體模型
- 直接記憶體和堆記憶體誰快記憶體
- 記憶體溢位和記憶體洩露記憶體溢位記憶體洩露
- Linux 的記憶體分頁管理Linux記憶體
- Linux的記憶體分頁管理Linux記憶體
- Redis 記憶體優化神技,小記憶體儲存大資料Redis記憶體優化大資料
- 【Java基礎】實體記憶體&虛擬記憶體Java記憶體
- 【記憶體洩漏和記憶體溢位】JavaScript之深入淺出理解記憶體洩漏和記憶體溢位記憶體溢位JavaScript
- 曹大談記憶體重排記憶體
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- Java記憶體模型(MESI、記憶體屏障、volatile和鎖及final記憶體語義)Java記憶體模型
- 如何檢視linux系統中空閒記憶體/實體記憶體使用/剩餘記憶體Linux記憶體
- [轉載] Java直接記憶體與堆記憶體Java記憶體
- JVM——記憶體洩漏與記憶體溢位JVM記憶體溢位
- 關於redis記憶體分析,記憶體優化Redis記憶體優化
- 記憶體管理兩部曲之實體記憶體管理記憶體
- 電腦記憶體怎麼擴大 如何更改電腦記憶體大小記憶體
- 記憶體模型記憶體模型
- 【AIX】記憶體AI記憶體
- 直接記憶體記憶體
- 段頁式記憶體管理(轉載)記憶體
- optee記憶體管理和頁表建立記憶體
- 【記憶體管理】頁面分配機制記憶體
- 記憶體的分配與釋放,記憶體洩漏記憶體
- 1.記憶體優化(一)記憶體洩漏記憶體優化