由于此类问题发生已有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 进程意外终止。