探索系列——神人steve adams之著oracle8i interal service(二十一)

wisdomone1發表於2010-05-11
the uga
         包含與某個特定會話相關的資訊,比如:
               開啟cursors持續及執行時的區域
               包的狀態資訊,特別是包的變數
               java會話狀態
               開啟的角色
               開啟的任何trace事件
               生效或執行中的nls引數
               開啟的任何資料庫連結
               基於可信任的oracle的會話的強制訪問控制mac標籤label
       

         和pga一樣,uga也包含兩個組成區域,固定uga和可變uga,或者uga heap.固定uga包含70個原子變數,細小的資料結構,指向uga heap的指標.


         uga heap的大塊對於x$ksmup它的會話是可見的,它與x$ksmsp結構相同.uga heap包含一些固定表的固定記憶體,這與某些初始化引數有關,比如
open_cursors,open_links,max_enabled_roles.除非之外,uga heap大多數或主要地largely專門用於私有sql和pl/sql areas.


         記憶體中uga的位置與會話的配置有關.在專有伺服器連線中,一個會話與一個程式是固定的1:1關係,uga就位於pga之中.固定uga就是pga其中一個大塊,
uga heap是pga的一個subheap.在mts和xa連結中,固定uga是共享池中的一個大塊,uga heap是大池的一個subheap,or failing that,the shared pool(不會譯).

         在這種配置情況下(指mts or xa),uga位於sga中,這樣就強迫每個使用者的uga消耗一定量the amount的sga記憶體.多麼精明的方法.可以用private_sga
profile resource limit來實現它.






the cga
         和其它的全域性區域不同,它是短暫的transient.僅僅只會存在於一個呼叫call期間.大多數對於例項的低階呼叫會用到它,這些呼叫包括:

                 解析一個sql語句
                 執行一個sql語句
                 提取一個select語句的輸出結果


         每個遞迴呼叫需要一個獨立的cga.在語句解析期間也可能需要對於查詢資料字典資訊的遞迴呼叫,為了檢查一個語句的語義,以及在語句最佳化期間
評估可選的執行計劃.在執行pl/sql塊時(為了處理每個sql語句子模組),也會用到遞迴呼叫,還有在dml語句執行過程中為了處理或進行或執行觸發器的執行.

         cga是pga一個subheap,而不管uga是否位於pga或者sga中.這個事實可以得一個重要的結論corollary,這些會話勢必對應任何呼叫期間的一個程式.
特別是開發mts的應用時,理解這個很重要.如果一些呼叫會延伸protracted,必須增加程式數目,用來減輕compensate for that.
   
         當然,呼叫calls不會在它們的cga中專用或排它使用資料結構.事實上與呼叫相關的一些重要的資料結構基本上typically在uga中.比如,私有sql和
pl/sql areas有排序區域必須位於uga,因為它們必須在多個呼叫期間持續存在.cga僅包含呼叫最後或結束時可以freed的資料結構.比如,cga包含直接i/o buffers,
遞迴呼叫的資訊,表示式評估的stack空間,以及其它的臨時資料結構.


         java call memory也會在cga中進行分配.這塊記憶體比其它任何的oracle記憶體區域管理更為集中.它被分割為三個空間,
the stack space,the new space,the old space.在the new space和old space中不再被引用的大塊就是收集的垃圾garbage collected,在根據它們的持有或佔有tenure
的長度和大小隨之變化的頻率,與之對應的呼叫執行期間.once一旦它們survived存在活一些new space的垃圾收集重複,new space chunks被複製到the old space.這是oracle
記憶體管理中唯一的垃圾收集方法.所有其它的oracle記憶體管理依賴於顯式或明確的dead chunks的freeings.


     


process memory allocation
         與sga不同,它在例項啟動就固定了大小,當然pga可以增長.使用malloc()或sbrk()來擴充套件程式的heap data segment可以達到增長process memory的作用.新os的虛擬
記憶體然後以一個新extent被新增到pga heap上.這些extents通常大小僅僅是幾k,如有必要oracle可能分配數以千計的extents.

         但是,一個程式的heap data segment增長是有限制的.大多情況下,這個預設限制是由maxdsiz來控制.在一些情況下,這個預設值也可以根據不同的程式來改變.
這也是對於所有程式的總計虛擬記憶體大小會有一個全域性的限制.這個限制與可用的swap space大小有關.如果超過任何一個限制,oracle相關程式會報ora-4030.


        這個錯誤很少發生,因為每個程式的資源限制,通常表明swap space不足.為了診斷這個問題,可以用os工具檢視swap space的使用情況.在一些os你也可以用另一個小工具maxmem
來檢查每一個程式可以被分配最大的heap data segment大小值是多少,以及which limit is being hit first.

        如果問題是swap space不足,如果paging 活動適度或者嚴重的話,此時你應嘗試減少全域性的虛擬記憶體使用,可以透過減少程式的數目或者減少每個程式的記憶體使用來達到這個目的.
否則,如果paging活動很輕微或為0時,你應增加swap space大小,最可取的是,如果你的os支援它,你應使用虛擬或pseudo
swap space.


        os工具允許全系統範圍內的虛擬記憶體超過space space,大約是未被鎖定的實體記憶體數量.一些sa無理反對使用這種特徵,
他們錯誤認為這樣會導致記憶體paging.其實不是這樣或其實不然.但是,它會極大減少在大記憶體系統上所需要swap space的數量.順便說一句incidentally,swap space應該是實體記憶體的2倍以上,
我認為這個世所知之的公理不一定正確,但是一些系統確實不需要swap space.





process memory deallocation

        oracle heaps增長比收縮更為容易或快速readily,但是與主流觀點相反的是,它們可以也能收縮.v$mystat和v$sesstat的會話統計資訊session uga memory和
session pga memory分別顯示uga和pga heaps的當前大小,包括內部空閒空間.與之對應的統計資訊session uga memory max和session pga memory max顯示了會話生命周
期內每個heaps的峰值大小.
 
        某些操作之後,uga和pga heaps才會進行收縮,比如一個disk sort的合併階段,或者顯式呼叫dbms_session.free_unused_user_memory過程free memory.但是,僅僅只有
完全空閒的heap extents會released給父heap或者給process data heap segment.甚至記憶體顯式被freed,一些內部的空閒空間仍會remains.


        雖然從技術方面可以這樣作,在大多os下,oracle不會學試減少process data heap segment的大小及release虛擬記憶體給os.因此從os角度來講,一個oracle程式的虛擬記憶體
大小會保持在它的hwm標準上.oracle依賴os來頁出任何不用的虛擬記憶體(如有必要).因此,oracle程式所佔用的虛擬記憶體大小的統計資訊就會誤導人.相反應使用內部的oracle統計資訊,
甚至這些會誇大真實的記憶體需要.

        在mts應用才會需要用dbms_session.free_unused_user_memory.應該謹慎使用它,僅僅只會把large package array variables使用的記憶體返回給large pool或共享池.
但是,記憶體首先應在uga heap中freed,這可以透過分配一個空佇列empty array給佇列變數,或者呼叫dbms_session.reset_package來達到目的.


        請忽略dbms_session包上面的基於記憶體效果的說明之相關注解,它們僅用於一個用途或作用,曾經僅僅為了同一個目的或作用而重用(can only ever be reused for the same purpose).
經歷了一個large sort之後,有必要free unused  user memory.what is intended is that memory所針對這部分記憶體,一旦分配給了一個subheap,通常情況下只在那個that subheap中可用,
直至整個subheap被freed.但是,許多subheaps,比如cga,freed過於快速致使語句至多產生了誤解(such as the cga,are freed so quicky that the statement is,at best misleading)
而且(此外)moreover,在一個sort後正常情況沒必要free unused user memory,not even甚至不是在mts應用中,因為大多數排序記憶體,實際上,自動進行freed.






taking headdumps
        oracle支援提取heapdumps資訊,為了便於診斷一個潛在的記憶體問題.在當前程式中使用alter session set event可以提取heapdumps資訊,或者在另一個會話用oradebug event.
heapdumps資訊會寫入程式的dump目錄結構的一個trace file中,它包含x$表的大量對應資訊.

        primary heaps的heapdumps的事件語法是immediate trace name heapdump level n.級別(n)是一個bit模式,代表要dump哪個heaps:1對應pga,2對應sga,4對應uga,8對應cga,32對應
large pool.
       
        arbitrary subheaps任意的subheaps的heapdumps的事件語法是immediate trace name heapdump_addr level n,這裡n是heap descriptor描述符的十六進位制地址所對應的十進位制.
ksm x$表的ksmchpar列可以檢視subheap heap descriptor addresss,以及在它們parent heaps的heapdumps旁邊上的ds=string  
     









reference參考
        這節包含引數,事件,統計的一些快速指志資訊



parameters引數
    
       引數                                                          描述

_large_pool_min_alloc                                                  大池大塊分配會四捨五入到這個值.預設是16k,不應被改變


_use_ism                                                               intimate親密共享記憶體預設被使用.但是,在一些os下實行這個是有問題的,因此有時有必要設定它為false


db_files log_files(oracle8.1之前)control_files                        它們影響固定pga的大小.它們的大小不應大於任何必要的配置(they should not be any larger than reasonably necessary) 



large_pools_size                                                       滿足大池的一些large chunks of memory的必然需要certain demands.


lock_sga                                                               如果os一直存在paging,應配置它為true,防止sga paging.


log_buffer                                                             雖然它是sga一個獨立區域,但從大小上講它是微不足道的


open_cursors open_links max_enabled_roles                              影響固定uga大小.它們的大小不要超過必要的大小


pre_page_sga                                                           設定為true,會導致所有的oracle伺服器程式,在程式啟動時,必要時分page in整個sga.這樣會在實際啟動之後哪個期間馬上產生一個小小或微小marginal的效能提升,但這樣同時會帶來所有程式啟動變慢的風險.



sessions                                                               它會對共享池的固定記憶體chunk的固定表的總計大小產生最大的影響



shared_memory_address hi_shared_memory_address                         在一些os上,用它們指定sga應被附加attached在虛擬記憶體地址哪個區哉



shared_pool_reserved_size                                              從共享池reserved list中選出滿足大於5000bytes的共享池chunk分配大小allocations.這個引數設定reserved lists的大小(以bytes計).reserved list分配的門限值,由_shared_pool_reserved_min_alloc決定,不應被改變.



shared_pool_size                                                       設定用於動態分配的共享池的大約的大小,以bytes表示


sort_area_size                                                         此引數對記憶體使用與效能有很大影響





events事件


事件                                                                描述

4030                                                                  這是程式記憶體錯誤事件的輸出out.為了提取發生匹配此精時間發生錯誤的pga,uga,cga,在你的引數檔案設定如下
                                                                        event="4030 trace name heapdump level 13"     


4031                                                                  這是共享記憶體錯誤事件的輸出.如果你發現系統一直重複報ora-04031錯誤,可以在引數檔案中設定如下事件以提取精確時間發生這個錯誤的sga heapdump資訊
                                                                        event="4031 trace name heapdump level 2"
                                                                      在mts環境中,為了包含一個uga heapdump,要採用level 6




10235                                                                  這個事件讓oracle server code不斷檢查記憶體完整性和heap管理資料結構.為了診斷一些可疑的記憶體損壞問題,有時這樣很有必要.但不幸的是,這個事件只適用下例項範圍,不能在單個程式上設定






statistics統計

        統計                                  出處或源頭                                         描述
free memory                                     v$sgastat                                          sga heap的空閒記憶體.它包含固定記憶體chunk上面空閒列表和備用空閒記憶體的大塊,但不包含unpinned 重建大塊



session uga memory                              v$sesstat and v$mystat                             會話uga heap的當前大小,不含固定uga



session uga memory max                          v$mystat and v$sesstat                             uga heap大小的hwm


session pga memory                              v$mystat and v$sesstat                             會話pga heap的當前大小,不含固定pga


session pga memory max                          v$mystat and v$sesstat                             pga heap大小的hwm                                 
 

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

相關文章