由於此類問題發生已有3次之多,所以,可以直接肯定是數據庫問題。
雖然昨個增大查詢堆的參數值,但是仍然未能解決。
上DB2日誌內容;
2014-07-18-10.23.13.869864+480 I8838102E311 LEVEL: Warning
PID : 30934 TID : 139650904241952PROC : db2fmp (
INSTANCE: db2inst1 NODE : 000
FUNCTION: DB2 UDB, routine_infrastructure, sqlerMasterThreadListener, probe:300
MESSAGE : Java heap is nearly full; no thread created
PID : 29888 TID : 140615278913280PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000 DB : DSP
APPHDL : 0-26 APPID: 66.185.64.125.16788.14071705004
AUTHID : DSP
EDUID : 44 EDUNAME: db2agent (DSP) 0
FUNCTION: DB2 UDB, routine_infrastructure, sqlerMasterThreadReq, probe:89
MESSAGE : FMP reported it could not create a new thread
DATA #1 : Hexdump, 4 bytes
0x0000000200E2F480 : D678 0000 .x..
PID : 29888 TID : 140615278913280PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000 DB : DSP
APPHDL : 0-26 APPID: 66.185.64.125.16788.14071705004
AUTHID : DSP
EDUID : 44 EDUNAME: db2agent (DSP) 0
FUNCTION: DB2 UDB, routine_infrastructure, sqlerGetFmpThread, probe:20
RETCODE : ZRC=0xFFFFFBEE=-1042
PID : 29888 TID : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 20 EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3108
MESSAGE : Started archive for log file S0000000.LOG.
PID : 29888 TID : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 20 EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgUserexitLogAdminMsg, probe:1140
MESSAGE : ADM1832E DB2 was unable to find the user exit program when archiving
log file "S0000000.LOG" from
"/home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/" for database
"DSP". The error code was "24".
PID : 29888 TID : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 20 EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3150
MESSAGE : ADM1848W Failed to archive log file "S0000000.LOG" to "USEREXIT"
from "/home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/".
PID : 29888 TID : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 20 EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgArchiveLogFile, probe:3155
DATA #1 : <preformatted>
Failed to archive log file S0000000.LOG to USEREXIT from /home/db2/dsp/db2inst1/NODE0000/SQL00001/SQLOGDIR/ return code 24.
PID : 29888 TID : 140615379576576PROC : db2sysc 0
INSTANCE: db2inst1 NODE : 000
EDUID : 20 EDUNAME: db2logmgr (DSP) 0
FUNCTION: DB2 UDB, data protection services, sqlpgRetryFailedArchive, probe:4780
MESSAGE : Still unable to archive log file 0 due to rc 24 for LOGARCHMETH1
using method 4 and target .
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
從日誌文件,可以看到Java heap is nearly full; no thread created。java堆棧已滿,不能創建線程。
最初我打算直接增大java_heap_sz這一參數大小的。由4096增大至8192。
並將該日誌報錯發在DB2的DBA羣裏。
羣內討論激烈,我也覺得單純修改java_heap_sz沒那麼簡單,應該還有其他原因制約。
一位DB2的DBA羣裏的大神,給予瞭解答。有些我能理解,有些我就不太明白。大致步驟如下:
db2level
db2set -all
db2 get dbm cfg
db2set -lr|grep DB2_FMP_COMM_HEAPSZ
db2pd -fmp
這裏詢問我物理內存還剩下多少,我用了free -m,查了下。
如果是20M的話,那你的系統就只夠10個db2fmp (process+thread)
那如果你要100個併發跑這個function的話,得好用200M內存
這裏的100是總的db2fmp的進程+線程
(最後要求我設置下)
db2set DB2_FMP_COMM_HEAPSZ=64000
重啓完跑下這個命令:db2pd -dbptnmem
--------------------------------------------------------------------------------------------------------------------------------------------------
DB2_FMP_COMM_HEAPSZ
這個是db2set 註冊表參數,將這個值設置爲 0 就表示不創建池,因此不能調用防護例程。每個防護例程所使用的空間是 ASLHEAPSZ 配置參數值的兩倍。
可以同時運行進程的計算公式:
Maximum Number of db2fmps = DB2_FMP_COMM_HEAPSZ / (2*ASLHEAPSZ)
文中的db2pd -fmp命令我沒用過。
ASLHEAPSZ: 這是一個數據庫管理器配置(DBM CFG)參數。這個參數確定緩衝區的大小,用於在例程和發出調用的應用程序之間傳遞參數。存儲過程中的參數數量和參數大小明確地影響這個配置參數。系統上允許同時存在的 db2fmp 進程的最大數量也受這個參數的影響
但是java查詢堆最大值受QUERY_HEAP_SZ影響。
QUERY_HEAP_SZ: 這是一個數據庫管理器配置(DBM CFG)參數。 這個參數指定可以分配給查詢堆的最大內存量。如果這個參數設置得過低,那麼執行復雜 SQL 的存儲過程會導致 db2fmp 進程意外終止。