年
月
日
發現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
/relink
sh to generate the new oracle binary oracle
new
$$
) copy oracle
new
$$ 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的統計結果也是一致的
至此
Oracle
i在AIX上的內存占用問題算是基本解決了
前後經歷了快一年的時間
這恐怕是我關注一個Oracle問題時間最久的一次
理由很簡單
這是工作需要
生產需要
要知道這麼隨便一搞
給我們剩下了很多麻煩
之前為了允許更多的連接
我們不得不將內存從
G擴容到
G
現在一降下來可以為企業節省很多硬件投入
畢竟這玩藝內存賣的還是挺貴的
而這是無成本的
過去這段時間
我工作的其中之一就是在為一個電信業務系統的升級做准備
在兩台IBM M
(
CPU*
G MEM AIX
L)上對ORACLE
I RAC做詳細的測試工作
開始的時候一切都很順利
但後來卻遇到一個難題
就是Oracle
i的單個進程占用的內存過多
經過一段時間測試
在先後解決了其它問題後
最後的主要問題集中到了內存上
ORACLE
i在AIX
L上每個進程都占用了很多內存
一個空連接進程就會用到
M多的內存
而眾所周知
Oracle
i的單個進程占用的內存一般是
~
M
所以這就引起了我們的高度重視
因為如果按此計算
個連接什麼事不做就要
G內存了!而我們的實際應用連接數比這還要多
在出現問題之後
我先後對ORACLE進行了不同方向的調整
也問過了一些朋友以及IBM和ORACLE的技術支持
翻遍了國內外我所知道的論壇
都沒有看到任何有意思的消息
更不要說解決方案了
這讓我開始懷疑是Oracle
i的BUG
果然在
月底Oracle公布了這個BUG(我是在
月底看到的
因為
月份的大部分時間在處理別的事)!造成這個問題是因為AIX上C的編譯器問題
使得本來可以共享的部分
最後都沒有共享
造成每個進程都浪費了大約
MB的內存
詳情參見本文最後BUG
的描述
為了驗證確實是AIX的問題
我在另外一台HP
UX B
上進行了同樣的測試
結果顯示Oracle
i的單個進程仍然占用很多內存!經過分析發現這是由於兩方面原因造成的
Oracle
i的初始化參數CURSOR_SPACE_FOR_TIME從默認的FALSE改成了TRUE
HP
UX上的Oracle
i將虛擬內存數據頁(virtual memory data pages)的默認值從原來的D(
KB)改成了L(
GB)
使用/usr/bin/chatr $ORACLE_HOME/bin/oracle查看oracle程序的內部屬性
我們發現虛擬內存的text段從原來的
M改成了
M
而DATA段從原來的
M改成了L(最大可達到
GB)
經過測試驗證
DATA段這個參數直接影響了Oracle
i單個進程所占用的內存的大小
對於空連接來說
MB是擴展的臨界點
因為空連接是擴不到
MB(
MB的下一個可設DATA段大小)
Oracle
i和Oracle
i虛擬內存默認值對比
i
shared library binding:
deferred
global hash table disabled shared vtable support disabled segments:
index type address flags size
text
z
r
c
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
z
r
c
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段是給命令用的
至此
我就在想了
自然在HP
UX上是因為這個原因造成的
那麼在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 non
shared const structures (probably about
Mb)
This bug is to track the issue of the non
shared const structures
From:http://tw.wingwit.com/Article/program/Oracle/201311/18891.html