版權聲明:轉載時請以超鏈接情勢標明文章原始出處和作者信息及本聲明
http://blog.csdn.net/wenshuangzhu/article/details/44095565
系統進程是通過虛擬地址訪問內存,但是CPU必須把它轉換程物理內存地址才能真正訪問內存。為了提高這個轉換效力,CPU會緩存最近的虛擬內存地址和物理內存地址的映照關系,并保存在1個由CPU保護的映照表中。為了盡可能提高內存的訪問速度,需要在映照表中保存盡可能多的映照關系。
而在Linux中,內存都是以頁的情勢劃分的,默許情況下每頁是4K,這就意味著如果物理內存很大,則映照表的條目將會非常多,會影響CPU的檢索效力。由于內存大小是固定的,為了減少映照表的條目,可采取的辦法只有增加頁的尺寸。
HugePages是在Linux2.6內核被引入的,主要提供4k的page和比較大的page的選擇。
概念 |
概念說明 |
page table |
page table是操作系統上的虛擬內存系統的數據結構模型,用于存儲虛擬地址與物理地址的對應關系。 當我們訪問內存時,首先訪問page table,然后Linux在通過page table的mapping來訪問真實物理內存(ram+swap) |
TLB |
A Translation Lookaside Buffer (TLB) TLB是在cpu中分配的1個固定大小的buffer(or cache),用于保存page table的部份內容,使CPU更快的訪問并進行地址轉換。 |
hugetlb |
hugetlb 是記錄在TLB 中的條目并指向Hugepages。 |
hugetlbfs |
這是1個新的基于2.6 kernel之上的內存文件系統,猶如tmpfs。 在TLB中通過hugetlb來指向hugepage。這些被分配的hugepage作為內存文件系統hugetlbfs(類似tmpfs)提供給進程使用。 |
HugePages是linux內核的1個特性,使用hugepage可以用更大的內存頁來取代傳統的4K頁面。使用HugePage主要帶來以下好處:
1. HugePages 會在系統啟動時,直接分配并保存對應大小的內存區域。
2. HugePages 在開機以后,如果沒有管理員的參與,是不會釋放和改變的。
3. 沒有swap。
Notswappable: HugePages are not swappable. Therefore thereis no page-in/page-outmechanism overhead.HugePages are universally regarded aspinned.
4. 大大提高了CPU cache中寄存的page table所覆蓋的內存大小,從而提高了TLB命中率。
進程的虛擬內存地址段先連接到page table然后再連接到物理內存。所以在訪問內存時需要先訪問page tables得到虛擬內存和物理內存的映照關系,然后再訪問物理內存。
CPU cache中有1部份TLB用來寄存部份page table以提高這類轉換的速度。由于page size變大了,所以一樣大小的TLB,所覆蓋的內存大小也變大了。提高了TLB命中率,也提高了地址轉換的速度。
5. 減輕page table的負載。
進行XXX系統性能測試時,如果沒有使用HugePages,數據庫服務器上的pagetable大小大約為5G(這應當也是致使性能測試時數據庫服務器內存不足的主要緣由):
node74:/home/oracle # cat /proc/meminfo
MemTotal: 16323732 kB
PageTables: 5442384kB
配置了HugePages后,pagetable大小僅為124M(性能測試時內存使用率穩定在80%左右):
node74:/home/oracle # cat /proc/meminfo
MemTotal: 16323732 kB
PageTables: 127384 kB
Eliminated page tablelookup overhead: 由于hugepage是不swappable的,所有就沒有page table lookups。
Faster overall memory performance: 由于虛擬內存需要兩步操作才能實際對應到物理內存地址,因此更少的pages,減輕了page table訪問熱度,避免了page table熱門瓶頸問題。
6. 提高內存的性能,下降CPU負載,原理同上
1. Hugepages是在分配后就會預留出來的,其大小1定要比服務器上所有實例的SGA總和要大,差1點都不行。
比如說Hugepages設置為8G,oracle SGA為9G,那末oracle在啟動的時候就不會使用到這8G的Hugepages。這8G就浪費了。所以在設置Hugepages時要計算SGA的大小,后面會給出1個腳本來計算。
2. 其他進程沒法使用Hugepages的內存,所以不要設置太大,稍稍比SGA大1點保證SGA可使用到hugepages就行了。
3. 在meminfo中和Hugepage相干的有4項:
HugePages_Total: 4611
HugePages_Free: 474
HugePages_Rsvd: 467
Hugepagesize: 2048 kB
HugePages_Total為所分配的頁面數目,和Hugepagesize相乘后得到所分配的內存大小。4611*2/1024大約為9GB
HugePages_Free為歷來沒有被使用過的Hugepages數目。即便oraclesga已分配了這部份內存,但是如果沒有實際寫入,那末看到的還是Free的。這是很容易誤解的地方。
HugePages_Rsvd為已被分配預留但是還沒有使用的page數目。在Oracle剛剛啟動時,大部份內存應當都是Reserved并且Free的,隨著oracle SGA的使用,Reserved和Free都會不斷的下降。
HugePages_Free-HugePages_Rsvd 這部份是沒有被使用到的內存,如果沒有其他的oracle instance,這部份內存或許永久都不會被使用到,也就是被浪費了。
4. HugePages和oracle AMM(自動內存管理)是互斥的,所以使用HugePages必須設置內存參數MEMORY_TARGET / MEMORY_MAX_TARGET 為0。
修改內核參數memlock,單位是KB,如果內存是16G,memlock的大小要略微小于物理內存。計劃lock 12GB的內存大小。參數設置為大于SGA是沒有壞處的。
以root用戶登錄兩臺數據庫服務器,編輯limits.conf文件:
node74:~ # vi /etc/security/limits.conf
增加以下兩行內容:
* soft memlock 12582912
* hard memlock 12582912
重新登錄root和oracle用戶,檢查memlocklimit
node74:~ # ulimit -l
12582912
oracle@node74:~> ulimit -l
12582912
如果使用11G及以后的版本,AMM已默許開啟,但是AMM與Hugepages是不兼容的,必須先disable AMM。禁用AMM的步驟以下:
已oracle用戶登錄兩臺數據庫服務器,通過sqlplus關閉2個數據庫實例。
oracle@node74:~> sqlplus / as sysdba
SQL> shutdown immediate
以oracle用戶登錄其中1臺主機,履行以下命令創建pfile:
oracle@node74:~> sqlplus / as sysdba
SQL> create pfile='/home/oracle/pfile.ora' fromspfile=’+DG_ORA/orcl/spfileorcl.ora’;
編輯pfile,刪除memory_max_target和memory_target參數:
oracle@node74:~> vi /home/oracle/pfile.ora
刪除下面幾行:
orcl1.memory_max_target=11114905600
orcl2.memory_max_target=11114905600
*.memory_max_target=0
orcl1.memory_target=11114905600
orcl2.memory_target=11114905600
*.memory_target=0
修改后保存文件。
履行以下命令創建spfile:
oracle@node74:~> sqlplus / as sysdba
SQL> create spfile='+DG_ORA/orcl/spfileorcl.ora'from pfile='/home/oracle/pfile.ora';
Kernel.shmall是系統1次可使用的最大同享內存大小。單位是page(4KB)。禁用AMM后,需要修改系統參數kernel.shmall,該參數設置太小的話,可能會致使數據庫啟動失敗ORA⑵7102(詳見附錄4.2)。
ORACLE建議將其設置為系統中所有數據庫實例的SGA總和。例如SGA總和為9GB,則需要設置kernel.shmall=9*1024*1024/4=2359296。
以root用戶登錄兩臺數據庫服務器,編輯sysctl.conf文件。
node74:~ # vi /etc/sysctl.conf
修改kernel.shmall參數:
kernel.shmall = 2359296
履行sysctl