The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

          Hugepages是從Linux kernal 2.6后被引入的,其目的是使用更大的memory page size以適應(yīng)越來越大的系統(tǒng)內(nèi)存,使得oracle SGA這種大內(nèi)存結(jié)構(gòu)能分配到一個(gè)大塊(hugepagesize)連續(xù)的內(nèi)存,提高效率.


          在Linux下,默認(rèn)的page size大小為4k。默認(rèn)的hugepagesize=2M。

          我們來看看兩者之間有什么區(qū)別

          1. Page Table大小(小page size 可以節(jié)省內(nèi)存,但提高管理成本page table的規(guī)模很大)

          Page Table是用來存放虛擬內(nèi)存也和物理內(nèi)存頁對(duì)應(yīng)關(guān)系的內(nèi)存結(jié)構(gòu)。因?yàn)閜age size較小,所以相應(yīng)的改內(nèi)存結(jié)構(gòu)也會(huì)比較大。

          而Hugepages的常見page size為2M,是4k size的500倍,所以可以大大減小page table的size。

          我們來看兩個(gè)例子:

          這是一個(gè)沒有配置Hugepage的系統(tǒng),系統(tǒng)內(nèi)存128G,pagetable大小大約為4G。

          cat /proc/meminfo

          MemTotal: 132086880 kB
          PageTables: 4059612 kB

          這是配置了Hugepage的系統(tǒng),系統(tǒng)內(nèi)存96G, PageTable大小僅為78M

          MemTotal: 98999880 kB
          PageTables: 79916 kB

          2. 大大提高了CPU cache中存放的page table所覆蓋的內(nèi)存大小,從而提高了TLB命中率

          進(jìn)程的虛擬內(nèi)存地址段先連接到page tables然后再連接到物理內(nèi)存。所以在訪問內(nèi)存時(shí)需要先訪問page tables得到虛擬內(nèi)存和物理內(nèi)存的映射關(guān)系,然后再訪問物理內(nèi)存。

          CPU cache中有一部分TLB(Translation Lookaside Buffer)用來存放部分page table以提高這種裝換的速度。因?yàn)閜age size變大了,所以同樣大小的TLB,所覆蓋的內(nèi)存大小也變大了。提高了TBL命中率,也就是提高了地址轉(zhuǎn)換的速度。

          3. 使用Hugepages的內(nèi)存頁是不會(huì)被交換出去的,永遠(yuǎn)常駐在內(nèi)存中,所以也減少了內(nèi)存也替換的額外開銷

          下面再說說在數(shù)據(jù)庫服務(wù)器上使用Hugepages要注意的幾點(diǎn)

          1. Hugepages是在分配后就會(huì)預(yù)留出來的,其大小一定要比服務(wù)器上所有實(shí)例的SGA總和要大,差一點(diǎn)都不行。

          比如說Hugepages設(shè)置為90G,oracle SGA為91G,那么oracle在啟動(dòng)的時(shí)候就不會(huì)使用到這90G的Hugepages。這90G就浪費(fèi)了。所以在設(shè)置Hugepages時(shí)要計(jì)算SGA的大小,后面會(huì)給出一個(gè)腳本來計(jì)算。

          2. 其他進(jìn)程無法使用Hugepages的內(nèi)存,所以不要設(shè)置太大,稍稍比SGA大一點(diǎn)保證SGA可以使用到hugepages就好了。

          3. PGA不會(huì)使用Hugepages的內(nèi)存。所以11g的AMM (Automatic Memory Management,memory_target參數(shù))是不被支持的。而ASMM(Automatic Shared Memory Management, SGA_target參數(shù))是被支持的,這兩個(gè)不要搞混淆了。

          4. 在meminfo中和Hugepage相關(guān)的有四項(xiàng)(RHEL5)

          HugePages_Total: 43000
          HugePages_Free: 29493
          HugePages_Rsvd: 23550
          Hugepagesize: 2048 kB

          HugePages_Total為所分配的頁面數(shù)目,和Hugepagesize相乘后得到所分配的內(nèi)存大小。43000*2/1024大約為84GB
          HugePages_Free為從來沒有被使用過的Hugepages數(shù)目。即使oracle sga已經(jīng)分配了這部分內(nèi)存,但是如果沒有實(shí)際寫入,那么看到的還是Free的。這是很容易誤解的地方
          HugePages_Rsvd為已經(jīng)被分配預(yù)留但是還沒有使用的page數(shù)目。在Oracle剛剛啟動(dòng)時(shí),大部分內(nèi)存應(yīng)該都是Reserved并且Free的,隨著oracle SGA的使用,Reserved和Free都會(huì)不斷的降低

          HugePages_Free – HugePages_Rsvd 這部分是沒有被使用到的內(nèi)存,如果沒有其他的oracle instance,這部分內(nèi)存也許永遠(yuǎn)都不會(huì)被使用到,也就是被浪費(fèi)了。在該系統(tǒng)上有11.5GB的內(nèi)存被浪費(fèi)了。

          Note: RHEL4上的meminfo有所區(qū)別,沒有HugePages_Rsvd這一項(xiàng),并且當(dāng)oracle instance啟動(dòng)時(shí),所分配的內(nèi)存就從free list上被移除掉了。也就是啟動(dòng)后HugePages_Free就是沒有被SGA用到被浪費(fèi)的內(nèi)存。

          最后說說如何設(shè)置HugePages:

          1. 首先計(jì)算SGA大小已決定你要使用多少HugePages內(nèi)存頁。

          你可以手工計(jì)算,如果使用了ASMM可以用SGA_Target/Hugepagesize,否則可以將 db_cache_size,large_pool_size, shared_pool_size,jave_pool_size, streams_pool_size五個(gè)部分加起來除以Hugepagesize。

          或者可以先將oracle instance都起起來,然后ipcs -m查看共享內(nèi)存段大小來計(jì)算。oracle在401749.1中也提供了一個(gè)腳本來幫助計(jì)算,腳本如下:

          #!/bin/bash
          #
          # hugepages_settings.sh
          #
          # Linux bash script to compute values for the
          # recommended HugePages/HugeTLB configuration
          #
          # Note: This script does calculation for all shared memory
          # segments available when the script is run, no matter it
          # is an Oracle RDBMS shared memory segment or not.
          #
          # This script is provided by Doc ID 401749.1 from My Oracle Support
          # http://support.oracle.com

          # Welcome text
          echo "
          This script is provided by Doc ID 401749.1 from My Oracle Support
          (http://support.oracle.com) where it is intended to compute values for
          the recommended HugePages/HugeTLB configuration for the current shared
          memory segments. Before proceeding with the execution please make sure
          that:
           * Oracle Database instance(s) are up and running
           * Oracle Database 11g Automatic Memory Management (AMM) is not setup
             (See Doc ID 749851.1)
           * The shared memory segments can be listed by command:
               # ipcs -m

          Press Enter to proceed..."

          read

          # Check for the kernel version
          KERN=`uname -r | awk -F. '{ printf("%d.%d\n",$1,$2); }'`

          # Find out the HugePage size
          HPG_SZ=`grep Hugepagesize /proc/meminfo | awk '{print $2}'`

          # Initialize the counter
          NUM_PG=0

          # Cumulative number of pages required to handle the running shared memory segments
          for SEG_BYTES in `ipcs -m | awk '{print $5}' | grep "[0-9][0-9]*"`
          do
             MIN_PG=`echo "$SEG_BYTES/($HPG_SZ*1024)" | bc -q`
             if [ $MIN_PG -gt 0 ]; then
                NUM_PG=`echo "$NUM_PG+$MIN_PG+1" | bc -q`
             fi
          done

          RES_BYTES=`echo "$NUM_PG * $HPG_SZ * 1024" | bc -q`

          # An SGA less than 100MB does not make sense
          # Bail out if that is the case
          if [ $RES_BYTES -lt 100000000 ]; then
             echo "***********"
             echo "** ERROR **"
             echo "***********"
             echo "Sorry! There are not enough total of shared memory segments allocated for
          HugePages configuration. HugePages can only be used for shared memory segments
          that you can list by command:

             # ipcs -m

          of a size that can match an Oracle Database SGA. Please make sure that:
           * Oracle Database instance is up and running
           * Oracle Database 11g Automatic Memory Management (AMM) is not configured"
             exit 1
          fi

          # Finish with results
          case $KERN in
             '2.4') HUGETLB_POOL=`echo "$NUM_PG*$HPG_SZ/1024" | bc -q`;
                    echo "Recommended setting: vm.hugetlb_pool = $HUGETLB_POOL" ;;
             '2.6') echo "Recommended setting: vm.nr_hugepages = $NUM_PG" ;;
              *) echo "Unrecognized kernel version $KERN. Exiting." ;;
          esac

          # End

          2. 關(guān)閉所有oracle實(shí)例

          3. 用root設(shè)定oracle memlock limit,設(shè)置一個(gè)較大的數(shù)值或者unlimited

          在/etc/security/limits.conf最后添加
          oracle hard memlock unlimited
          oracle soft memlock unlimited

          4. 分配hugepages內(nèi)存

          在/etc/sysctl.conf中添加

          vm.nr_hugepages = 46000 (step1′s value)

          執(zhí)行sysctl -p使其生效。這時(shí)候內(nèi)存就已經(jīng)被分配了,可以查看meminfo

          grep Huge /proc/meminfo

          HugePages_Total為設(shè)定的值大小,HugePages_Free應(yīng)該和HugePages_Total一樣大,HugePages_Rsvd為0.

          5. 啟動(dòng)Oracle instance

          這時(shí)候再次查看meminfo

          HugePages_Total為設(shè)定的值大小不變,HugePages_Free有所降低,HugePages_Rsvd為一個(gè)較大的數(shù)值(因?yàn)閯倓倖?dòng)時(shí),大部分SGA被分配但是沒有被使用到)。

          如果Hugepages沒有被使用,可能一些memory page被分配為4k大小了,那么需要重啟server來設(shè)置。

          從我們的測(cè)試結(jié)果看,Hugepages可以提高OLTP系統(tǒng)10%的吞吐量,當(dāng)然不同的數(shù)據(jù)庫應(yīng)用結(jié)果可能不同,但是總體來說這是一個(gè)nice to have的設(shè)置。

          posted on 2014-04-16 14:31 Eric_jiang 閱讀(318) 評(píng)論(0)  編輯  收藏 所屬分類: Linux
          主站蜘蛛池模板: 万宁市| 新龙县| 噶尔县| 兰溪市| 伊宁县| 汝南县| 天祝| 扎赉特旗| 盐城市| 九龙城区| 利川市| 红河县| 秦皇岛市| 湖北省| 彭州市| 根河市| 瑞昌市| 奉贤区| 建瓯市| 肇州县| 五原县| 恭城| 林芝县| 东安县| 青浦区| 宝坻区| 绥江县| 普格县| 龙泉市| 克拉玛依市| 沁源县| 清远市| 滁州市| 安多县| 阳谷县| 神池县| 湛江市| 共和县| 河东区| 大安市| 宜黄县|