Kbase P127996: SQL-92 session dies with insufficient memory error -211023 running OpenEdge 10.1B 64-bit on IBM AIX
Autor |
  Progress Software Corporation - Progress |
Acesso |
  Público |
Publicação |
  30/12/2010 |
|
Status: Unverified
SYMPTOM(s):
SQL-92 session dies with insufficient memory error
Exact text of error messages can vary
=== SQL Exception 1 ===
SQLState=HY000
ErrorCode=-211023
[DataDirect][OpenEdge JDBC Driver][OpenEdge] Insufficient Memory. Memory allocation failed at 500 in /vobs_sql/sql/src/rds/psr_tbld.cxx. Contact Progress Technical Support
=== SQL Exception 1 ===
SQLState=HY000
ErrorCode=-211023
[DataDirect][OpenEdge JDBC Driver][OpenEdge] Insufficient Memory. Memory allocation failed at 139 in /vobs_sql/sql/src/rds/psr_env.cxx. Contact Progress Technical Support
=== SQL Exception 1 ===
SQLState=HY000
ErrorCode=-211023
[DataDirect][OpenEdge JDBC Driver][OpenEdge] Insufficient Memory. Memory allocation failed at 1159 in /vobs_sql/sql/src/rds/opt_qcf1.cxx. Contact Progress Technical Support
=== SQL Exception 1 ===
SQLState=HY000
ErrorCode=-211023
[DataDirect][OpenEdge JDBC Driver][OpenEdge] Insufficient Memory. Memory allocation failed at 364 in /vobs_sql/sql/src/rds/opt_anl1.cxx. Contact Progress Technical Support
Problem affects individual user sessions
_SQLSRV2 process does not crash
Database is running on IBM AIX 64-bit
No error messages reported in the database log file; user disappears with no logout event
FACT(s) (Environment):
OpenEdge 10.1B 64-bit
OpenEdge 10.1B03 64-bit Service Pack
IBM AIX POWER 5.3 64-bit
OpenEdge 10.2A
CAUSE:
The amount of free space in a memory segment for data (user stack, kernel stack,u-block, etc) is insufficient. On IBM AIX, by default, a process can use 1 segment for heap and anything allocated by malloc(). A process (in this case _SQLSRV2) is limited to 256MB. The rest of the segments are left for shared memory (shmat(), mmap()). In case of a 32-bit process it can only attach 16 segments of 256MB (segment 2 for heap and segments 3 to C for shared memory, while 1, D, E, F are reserved). For 64-bit processes the same concept of segments is still valid (but with larger number of segments). The limit can be changed either during compilation time (of _SQLSRV2), runtime settings via environmental variables or by modifying the program header (with ldedit). In case of our _SQLSRV2 the maxDATA is set to 0x00000000, so the process uses one segment for data (heap) of 256MB.
FIX:
Increase the number of memory segments available for use by the _SQLSRV2 process:
export LDR_CNTRL=MAXDATA=<value>
Example:
export LDR_CNTRL=MAXDATA=0x10000000
<start database>
unset LDR_CNTRL
This will allow the _SQLSRV2 process to access an additional memory segment of 256MB, i.e. the process now has access to 512MB. The setting may have to be tuned depending upon the application/data being accessed.