熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle9i進程內存占用問題解決方法

2013-11-13 22:22:10  來源: Oracle 

  發現Oracle公布了有關此問題的一些說明和部分解決方法大致的內容是AIX可以打個補丁來獲得更好的效果而其他版本只能通過設置以下環境變量來減少消耗
  
  AIXTHREAD_SCOPE=S;export AIXTHREAD_SCOPE
  
  NUM_SPAREVP=; export NUM_SPAREVP(AIX
  
  詳細內容參考Metalink文檔 Memory Consumption on AIX此文檔是DEC創建的最近更新JAN
  
  我們拿了一台新的M安裝了AIX開始測試這一結果設置這些環境可以起一定的作用但沒有明顯效果
  
  根據文檔說明安裝AIX APAR IY補丁執行如下步驟
  
  從這裡下在相關腳本
  ) save your current version of $ORACLE_HOME/oracle
  ) create a working directory $ORACLE_HOME/relink
  ) cd to $ORACLE_HOME/relink
  ) unzip the relinking package
  ) link $ORACLE_HOME/bin/oracle to /oracle
  ) run the script /genscript to generate some required files and scripts
  ) run /relinksh to generate the new oracle binary oraclenew$$
  ) copy oraclenew$$ to $ORACLE_HOME/bin/oracle and verify that the permissions match the original oracle binary
  
  驗證結果很明顯內存占用改善了很多沒有打補丁的一個空連接server進程占用最低都是M多而現在只有M多改善了%!
  hawk> ps v (沒打補丁的空連接)
  PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
   A : xx oracle
  localhost> ps v (打過補丁的空連接)
  PID TTY STAT TIME PGIN SIZE RSS LIM TSIZ TRS %CPU %MEM COMMAND
   A : oracleor
  
  雖然說這裡ps v看到的結果不是很准確但是二者使用相同的標准計算並不影響對比結果而且和我們使用NMON的統計結果也是一致的
  
  至此Oraclei在AIX上的內存占用問題算是基本解決了前後經歷了快一年的時間這恐怕是我關注一個Oracle問題時間最久的一次理由很簡單這是工作需要生產需要要知道這麼隨便一搞給我們剩下了很多麻煩之前為了允許更多的連接我們不得不將內存從G擴容到G現在一降下來可以為企業節省很多硬件投入畢竟這玩藝內存賣的還是挺貴的而這是無成本的
  
  過去這段時間我工作的其中之一就是在為一個電信業務系統的升級做准備在兩台IBM MCPU*G MEM AIX L)上對ORACLEI RAC做詳細的測試工作開始的時候一切都很順利但後來卻遇到一個難題就是Oracle i的單個進程占用的內存過多
  
  經過一段時間測試在先後解決了其它問題後最後的主要問題集中到了內存上ORACLEi在AIX L上每個進程都占用了很多內存一個空連接進程就會用到M多的內存而眾所周知Oraclei的單個進程占用的內存一般是~M所以這就引起了我們的高度重視因為如果按此計算個連接什麼事不做就要G內存了!而我們的實際應用連接數比這還要多
  
  在出現問題之後我先後對ORACLE進行了不同方向的調整也問過了一些朋友以及IBM和ORACLE的技術支持 翻遍了國內外我所知道的論壇都沒有看到任何有意思的消息更不要說解決方案了這讓我開始懷疑是Oraclei的BUG果然在月底Oracle公布了這個BUG(我是在月底看到的因為月份的大部分時間在處理別的事)!造成這個問題是因為AIX上C的編譯器問題使得本來可以共享的部分最後都沒有共享造成每個進程都浪費了大約MB的內存詳情參見本文最後BUG的描述
  
  為了驗證確實是AIX的問題我在另外一台HPUX B上進行了同樣的測試結果顯示Oraclei的單個進程仍然占用很多內存!經過分析發現這是由於兩方面原因造成的
  
  Oraclei的初始化參數CURSOR_SPACE_FOR_TIME從默認的FALSE改成了TRUE
  
  HPUX上的Oraclei將虛擬內存數據頁(virtual memory data pages)的默認值從原來的D(KB)改成了L(GB)
  
  使用/usr/bin/chatr $ORACLE_HOME/bin/oracle查看oracle程序的內部屬性 我們發現虛擬內存的text段從原來的M改成了M而DATA段從原來的M改成了L(最大可達到GB)經過測試驗證 DATA段這個參數直接影響了Oraclei單個進程所占用的內存的大小 對於空連接來說MB是擴展的臨界點因為空連接是擴不到MB(MB的下一個可設DATA段大小)
  
  Oraclei和Oraclei虛擬內存默認值對比
  i
  
  shared library binding:
  deferred
  global hash table disabled shared vtable support disabled segments:
  index type address flags size
    text zrc M
    data m M
  executable from stack: D (default)kernel assisted branch prediction enabled lazy swap allocation for dynamic segments disabled
  
  i
  
  shared library binding:
  deferred
  global hash table disabled shared vtable support disabled segments:
  index type address flags size
    text zrc M
    data m L (largest possible)executable from stack: D (default)kernel assisted branch prediction enabled lazy swap allocation for dynamic segments disabled
  
  我們可以使用/usr/bin/chatr +pd newsize $ORACLE_HOME/bin/oracle來更改DATA段的可用內存大小對於text段的內存大小我們也可以使用chatr +pi來改但gototop並不建議你這樣做因為text段是給命令用的
  
  至此我就在想了自然在HPUX上是因為這個原因造成的那麼在AIX上除了C編譯器的原因之外是否也存在著同樣的問題呢?到目前為止gototop還沒有的等到任何可靠的消息來證明這一點但我猜想可能性很大
  
  附BUG:描述
  
//jpg>

  問題陳述:
  
  ORACLE ON AIX DOES NOT SHARE MANY CONST STRUCTS PER PROCESS MEMORY OVERHEAD
  
  
  
  *** // : am ***
  
  =========================  
  
  PROBLEM:
  
   Clear description of the problem encountered:
  
  Oracle on IBM AIX platforms (AIX L and ) use a large amount of memory per dedicated connection For Oracle on AIX L the memory required per idle Oracle process appears to be about Mb A significant portion of this is related to nonshared const structures (probably about Mb)  
  
  This bug is to track the issue of the nonshared const structures
From:http://tw.wingwit.com/Article/program/Oracle/201311/18891.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.