| The PostgreSQL 9.0 Reference Manual - Volume 3 - Server Administration Guide
by The PostgreSQL Global Development Group Paperback (6"x9"), 274 pages ISBN 9781906966072 RRP £9.95 ($14.95) Sales of this book support the PostgreSQL project! Get a printed copy>>> |
1.8.1.4 Memory management
AIX can be somewhat peculiar with regards to the way it does
memory management. You can have a server with many multiples of
gigabytes of RAM free, but still get out of memory or address
space errors when running applications. One example
is createlang failing with unusual errors.
For example, running as the owner of the PostgreSQL installation:
-bash-3.00$ createlang plperl template1 createlang: language installation failed: ERROR: could not load library "/opt/dbs/pgsql748/lib/plperl.so": A memory address is not in the address space for the process.
Running as a non-owner in the group possessing the PostgreSQL installation:
-bash-3.00$ createlang plperl template1 createlang: language installation failed: ERROR: could not load library "/opt/dbs/pgsql748/lib/plperl.so": Bad address
Another example is out of memory errors in the PostgreSQL server logs, with every memory allocation near or greater than 256 MB failing.
The overall cause of all these problems is the default bittedness and memory model used by the server process. By default, all binaries built on AIX are 32-bit. This does not depend upon hardware type or kernel in use. These 32-bit processes are limited to 4 GB of memory laid out in 256 MB segments using one of a few models. The default allows for less than 256 MB in the heap as it shares a single segment with the stack.
In the case of the createlang example, above,
check your umask and the permissions of the binaries in your
PostgreSQL installation. The binaries involved in that example
were 32-bit and installed as mode 750 instead of 755. Due to the
permissions being set in this fashion, only the owner or a member
of the possessing group can load the library. Since it isn't
world-readable, the loader places the object into the process'
heap instead of the shared library segments where it would
otherwise be placed.
The “ideal” solution for this is to use a 64-bit build of PostgreSQL, but that is not always practical, because systems with 32-bit processors can build, but not run, 64-bit binaries.
If a 32-bit binary is desired, set LDR_CNTRL to
MAXDATA=0xn0000000,
where 1 <= n <= 8, before starting the PostgreSQL server,
and try different values and ‘postgresql.conf’
settings to find a configuration that works satisfactorily. This
use of LDR_CNTRL tells AIX that you want the
server to have MAXDATA bytes set aside for the
heap, allocated in 256 MB segments. When you find a workable
configuration,
ldedit can be used to modify the binaries so
that they default to using the desired heap size. PostgreSQL can
also be rebuilt, passing configure
LDFLAGS="-Wl,-bmaxdata:0xn0000000"
to achieve the same effect.
For a 64-bit build, set OBJECT_MODE to 64 and
pass CC="gcc -maix64"
and LDFLAGS="-Wl,-bbigtoc"
to configure. (Options for
xlc might differ.) If you omit the export of
OBJECT_MODE, your build may fail with linker errors. When
OBJECT_MODE is set, it tells AIX's build utilities
such as ar, as, and ld what
type of objects to default to handling.
By default, overcommit of paging space can happen. While we have not seen this occur, AIX will kill processes when it runs out of memory and the overcommit is accessed. The closest to this that we have seen is fork failing because the system decided that there was not enough memory for another process. Like many other parts of AIX, the paging space allocation method and out-of-memory kill is configurable on a system- or process-wide basis if this becomes a problem.
| ISBN 9781906966072 | The PostgreSQL 9.0 Reference Manual - Volume 3 - Server Administration Guide | See the print edition |