Oracle基礎知識-內存管理(未整理)

 
oracle9i:

 

教訓:windows平臺下萬萬不可將sga_max_size設得過大,曾經有一次將其從1200M加大到1500M,結果數據庫啓動時報ORA-27100:shared memory realm already exits。原因是:對於32位的os,每個進程可以訪問的最大內存空間是2的32次方,即4G.每個進程的內存由user space和kernal space兩個組件組成.user space可以使用的內存空間最大爲2g。對於oracle,可使用的內存空間大概是1.7G左右。要注意的是:專用會話(以專用數據庫連接建立的會話)的內存在sga之外的內存空間分配,但仍然在oracle.exe進程之內。如果sga_max_size過大,sga_max_size+專用會話內存超過1.7G,這可能是ORA-27100出現的原因


workarea_size_policy=true 內存自動管理,
可以不管sort_area_size,hash_area_size等等煩人的設置,也不用再去計算繁瑣的pga大小
oracle會根據pga_aggregate_target, v$pgastat.global memory bound限制每個session使用pga的最大空間,每個session可以使用到最大至5%pga的總空間
如果pga_aggregate_target=1G,則每個session可以使用到最大爲50M

對於一個單純的數據庫服務器,通常我們需要保留20%的物理內存給操作系統使用,剩餘80%可以分配給Oracle使用。Oracle使用的內存分爲兩部分SGA和PGA,那麼PGA可以佔用Oracle消耗總內存的20%(OLTP系統)至50%(DSS系統)。
這只是一個建議設置,更進一步的我們應該根據數據庫的具體性能指標來調整和優化PGA的使用。

對於所有的進程,操作系統對整個虛擬內存也有一個系統全局性的限制,這個限制跟系統的SWAP SPACE相關.一旦超過了這兩個限制,Oracle的進程在執行中會遇到ORA-4030錯誤.
 

ORA-4030這個錯誤的產生一般不是因爲每個進程的資源限制而是因爲SWAP SPACE空間不足造成.爲了診斷這個問題可以使用操作系統的一些選項來查看SWAP SPACE的使用情況.另外,在一些操作系統中,Oracle包含了一個工具叫maxmem,它可以用來查看每個進程可以被分配的堆數據段的最大SIZE以及哪一個限制是第一次超過的.
 

如果這個問題的出現是因爲SWAP SPACE空間不足,而且換頁的動作非常頻繁而且較多,則需要減少系統一級的虛擬內存的使用,這個可以通過減少進程數也可以通過減少每個進程的內存限制.如果換頁動作不頻繁而且比較少,則需要調大SWAP SPACE SIZE.


------------------------------------------------------------------------------------------------------------------------------------------------------

如果問題是由於swap空間不足造成的,並且由中度或者嚴重的page in/page out(可以用vmstat查看),你就需要嘗試降低系統整體的虛擬內存的使用(如調整SGA大小),或者降低單個進程內存的使用(如調整sort_area_size),或者減少進程數量(如限制processes參數,使用MTS)。而如果page in/page out很少或者根本沒有,就可以考慮增大swap空間。某些系統中,可以考慮使用僞交換區(如hp-ux中,可以考慮設置swapmen_on)。

如果問題和PLSQL操作有關,可以,1、檢查PLSQL中的TABLE,看看其中的數據是否全都必要,是否可以減少數據放入TABLE中;2、優化相關語句(比如通過調整優化器策略,使查詢計劃走sort比較少的訪問路徑),減少sort操作,或者減少sort_area_size(代價就是一部分sort操作會放在磁盤上進行,降低性能)。

9i以後可以考慮設置PGA內存自動管理。即設置PGA_AGGREGATE_TARGET在一定數值範圍內,WORKAREA_SIZE_POLICY設置爲AUTO。但是注意,9i在OpenVMS系統上、或者在MTS模式下不支持PGA內存自動關聯。

如果是因爲進程數過多導致的內存大量消耗,首先可以考慮調整客戶端,減少不必要的會話連接,或者採用連接池等方式,以保持系統有穩定的連接數。如果會話非常多,且無法降低的話,可以考慮採用MTS,以減少Oracle進程數。

檢查SGA中的內存區是否分配過多(如shared pool、large pool、java pool)等,嘗試減少SGA的內存大小。

在windows下,可以嘗試使用ORASTACK來減少線程的堆棧大小,以釋放更多的內存。

考慮增加物理內存。


--------------------------------------------------------------------------------------------------------------------------------------------------------
PGA(program global areas)   保存服務進程的數據和控制信息的內存結構,這個內存結構是非共享的,只有服務進程本身才能夠訪問它自已的PGA區。每個服務進程都有它自已的PGA區,各個服務進程PGA的總和即爲實例的PGA區的大小
資料引用:http://www.knowsky.com/388134.html

show parameter pga;
show parameter sga;
show sga;---顯示內存分配量(Total SGA與sga_max_size有關,可能比v$sgastat的和要多一些)
show parameter size;
select * from v$pgastat;
select sum(bytes) from v$sgastat;---顯示實際內存使用量
--查查看都是哪些process佔用內存多(從下面這個查詢可以看到v$session s, v$sesstat st, v$statname sn, v$process p這四個動態視圖之間的關係)
SELECT   s.SQL_ADDRESS,s.MACHINE,s.PROGRAM,s.LOGON_TIME,s.PROCESS,server, s.username, s.osuser, sn.NAME, st.VALUE / 1024 / 1024, s.SID, s.serial#, p.spid
    FROM v$session s, v$sesstat st, v$statname sn, v$process p
   WHERE st.SID = s.SID
     AND st.statistic# = sn.statistic#
     AND sn.NAME LIKE 'session pga memory'
     AND p.addr = s.paddr
     AND VALUE > 10 * 1024 * 1024                                              --only show pga > 10M
ORDER BY VALUE DESC

---然後通過查詢v$sqlarea可得到該process正在執行的sql語句

select t.SQL_TEXT,t.ADDRESS from v$sqlarea t where t.ADDRESS='上面的SQL_ADDRESS'

----------------------------------------------------------
Usage:  orakill sid thread

  where sid    = the Oracle instance to target
        thread = the thread id of the thread to kill

  The thread id should be retrieved from the spid column of a query such as:

        select spid, osuser, s.program from
        v$process p, v$session s where p.addr=s.paddr


或者:
select sid,serial#,username,program,machine,status from v$session;
 然後
alter system kill session 'SID,SERIAL#';

注意,上例中SID爲1到7(USERNAME列爲空)的會話,是Oracle的後臺進程,不要對這些會話進行任何操作。

----------------------------------------------------------

v$process
這個視圖提供的信息,都是oracle服務進程的信息,沒有客戶端程序相關的信息
服務進程分兩類,一是後臺的,一是dedicate/shared server
pid, serial# 這是oracle分配的PID
spid 這纔是操作系統的pid(實際上是oracle進程中的線程)
program 這是服務進程對應的操作系統進程名

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章