Skip to content
Snippets Groups Projects
Select Git revision
  • benchmark-tools
  • postgres-lambda
  • master default
  • REL9_4_25
  • REL9_5_20
  • REL9_6_16
  • REL_10_11
  • REL_11_6
  • REL_12_1
  • REL_12_0
  • REL_12_RC1
  • REL_12_BETA4
  • REL9_4_24
  • REL9_5_19
  • REL9_6_15
  • REL_10_10
  • REL_11_5
  • REL_12_BETA3
  • REL9_4_23
  • REL9_5_18
  • REL9_6_14
  • REL_10_9
  • REL_11_4
23 results

FAQ_AIX

Blame
  • FAQ_AIX 17.58 KiB
    =======================================================
    Frequently Asked Questions (FAQ) for PostgreSQL
    AIX Specific
    TO BE READ IN CONJUNCTION WITH THE NORMAL FAQ
    =======================================================
    Last updated:        $Date: 2006/12/06 15:45:30 $
    
    Topics
    
    - AIX 4.3.2 Port Report
    - AIX 5.3 Additional Information
    - AIX, readline, and postgres 8.1.x:
    - AIX Memory Management: An Overview
    - Statistics Collector Fun on AIX
    
    -----
    
    From: Zeugswetter Andreas <ZeugswetterA@spardat.at>
    $Date: 2006/12/06 15:45:30 $
    
    On AIX 4.3.2 PostgreSQL compiled with the native IBM compiler xlc
    (vac.C 5.0.1) passes all regression tests.  Other versions of OS and
    compiler should also work. If you don't have a powerpc or use gcc you
    might see rounding differences in the geometry regression test.
    
    Use the following configure flags in addition to your own
    if you have readline or libz there:
    --with-includes=/usr/local/include --with-libraries=/usr/local/lib
    
    There will probably be warnings about 0.0/0.0 division and duplicate
    symbols which you can safely ignore.
    
    Compiling PostgreSQL with gcc (2.95.3) on AIX also works.
    
    You need libm.a that is in the fileset bos.adt.libm.  (Try the
    following command.)
    $ lslpp -l bos.adt.libm
    
    
    ---
    From: Christopher Browne <cbbrowne@ca.afilias.info>
    Date: 2005-07-15
    
    On AIX 5.3, there have been some problems getting PostgreSQL to
    compile and run using GCC.
    
    1.  You will want to use a version of GCC subsequent to 3.3.2,
        particularly if you use a prepackaged version.  We had good
        success with 4.0.1.
    
        Problems with earlier versions seem to have more to do with the
        way IBM packaged GCC than with actual issues with GCC, so that if
        you compile GCC yourself, you might well have success with an
        earlier version of GCC.
    
    2.  AIX 5.3 has a problem where sockadr_storage is not defined to be
        large enough.  In version 5.3, IBM increased the size of
        sockaddr_un, the address structure for UNIX Domain Sockets, but
        did not correspondingly increase the size of sockadr_storage.
    
        The result of this is that attempts to use UDS with PostgreSQL
        lead to libpq overflowing the data structure.  TCP/IP connections
        work OK, but not UDS, which prevents the regression tests from
        working.
    
       The nonconformance may be readily demonstrated by compiling and
       running the following C program which calculates and compares the
       sizes of the various structures:
    
    test_size.c
    ------------
    
    ---------- snip here - test_size.c ----------------------------
    #include <stdio.h>
    #include <sys/un.h>
    #include <sys/socket.h>
    int main (int argc, char *argv[]) {
            struct sockaddr_storage a;
            struct sockaddr_un b;
            printf("Size of sockadr_storage: %d\n", sizeof(a));
            printf ("Size of sockaddr_un:%d\n", sizeof(b));
    
            if (sizeof(a) >= sizeof(b)) 
                    printf ("Conformant to RFC 3493\n");
            else
                    printf ("Non-conformant to RFC 3493\n");
    } 
    ---------- snip here - test_size.c ----------------------------
    
    
    The problem was reported to IBM, and is recorded as bug report
    PMR29657.
    
    An immediate resolution is to alter _SS_MAXSIZE to = 1025 in
    /usr/include/sys/socket.h, which will resolve the immediate problem.
    
    It appears that the "final" resolution will be to alter _SS_MAXSIZE to
    1280, making the size nicely align with page boundaries.
    
    IBM will be providing a fix in the next maintenance release (expected
    in October 2005) with an updated socket.h.
    ---
    PMR29657 was resolved in APAR IY74147: INCOMPATIBILITY BETWEEN
    SOCKADDR_UN AND SOCKADDR_STORAGE STRUCT
    
    APAR information
    APAR number	IY74147
    Reported component name	AIX 5.3
    Reported component ID	5765G0300
    Reported release	530
    Status	CLOSED PER
    PE	NoPE
    HIPER	NoHIPER
    Submitted date	2005-07-18
    Closed date	2005-07-18
    Last modified date	2005-09-06
    
    If you upgrade to maintenance level 5300-03, that will include this
    fix.  Use the command "oslevel -r" to determine what maintenance level
    you are at.
    ---
    From: Christopher Browne <cbbrowne@ca.afilias.info>
    Date: 2005-07-15
    
    Some of the AIX tools may be "a little different" from what you may be
    accustomed to on other platforms.  If you are looking for a version of
    ldd, useful for determining what object code depends on what
    libraries, the following URLs may help you...
    
    http://www.faqs.org/faqs/aix-faq/part4/section-22.html
    
    http://www.han.de/~jum/aix/ldd.c
    
    ---
    From: Christopher Browne <cbbrowne@ca.afilias.info>
    Date: 2005-11-02
    
    On AIX 5.3 ML3 (e.g. maintenance level 5300-03), there is some problem
    with the handling of the pointer to memcpy.  It is speculated that
    this relates to some linker bug that may have been introduced between
    5300-02 and 5300-03, but we have so far been unable to track down the
    cause.
    
    At any rate, the following patch, which "unwraps" the function
    reference, has been observed to allow PG 8.1 pre-releases to pass
    regression tests.
    
    The same behaviour (albeit with varying underlying functions to
    "blame") has been observed when compiling with either GCC 4.0 or IBM
    XLC.
    
    ------------ per Seneca Cunningham -------------------
    
    The following patch works on the AIX 5.3 ML3 box here and didn't cause
    any problems with postgres on the x86 desktop.  It's just a cleaner
    version of what I tried earlier.
    
    *** dynahash.c.orig Tue Nov  1 19:41:42 2005
    --- dynahash.c  Tue Nov  1 20:30:33 2005
    ***************
    *** 670,676 ****
    
    
                /* copy key into record */
                currBucket->hashvalue = hashvalue;
    !           hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, keysize);
    
    
                /* caller is expected to fill the data field on return */
    
    
    --- 670,687 ----
    
    
                /* copy key into record */
                currBucket->hashvalue = hashvalue;
    !           if (hashp->keycopy == memcpy)
    !           {
    !               memcpy(ELEMENTKEY(currBucket), keyPtr, keysize);
    !           }
    !           else if (hashp->keycopy == strncpy)
    !           {
    !               strncpy(ELEMENTKEY(currBucket), keyPtr, keysize);
    !           }
    !           else
    !           {
    !               hashp->keycopy(ELEMENTKEY(currBucket), keyPtr, keysize);
    !           }
    
    
                /* caller is expected to fill the data field on return */
    
    ------------ per Seneca Cunningham -------------------
    
    ---
    
    AIX, readline, and postgres 8.1.x:
    ----------------------------------
    
    If make check doesn't work on AIX with initdb going into an infinite
    loop or failing with child processes terminated with signal 11, the 
    problem could be the installed copy of readline.  Previously a patch to 
    dynahash.c was suggested to get around this, don't use it, better ways
    to get postgres working exist.
    
    See <http://archives.postgresql.org/pgsql-patches/2005-11/msg00139.php>
    for details about the problem.
    
    Working around the problem:
    ---------------------------
    Try one of the following:
    
    o  Use the new 8.2devel backend Makefile:
    
    After the matter of readline's export list and the problems that were
    occurring on AIX because of it being linked to the backend, a filter
    to exclude unneeded libraries from being linked against the backend was
    added.  Get revision 1.112 of src/backend/Makefile from CVS and replace
    the copy that came with postgres with it.  Build normally.
    
    o  Use libedit
    
    There are a few libedit ports available online.  Build and install the
    desired port.  If libreadline.a can be found in /lib, /usr/lib, or in
    any location passed to postgres' configure via "--with-libraries=",
    readline will be detected and used by postgres.  IBM's rpm of readline
    creates a symlink to /opt/freeware/lib/libreadline.a in /lib, so merely 
    excluding /opt/freeware/lib from the passed library path does not stop
    readline from being used.  
    
    If the linker cannot avoid finding libreadline.a, use revision 1.433 
    configure.in and 1.19 config/programs.m4 from CVS, change 8.2devel to 
    the appropriate 8.1.x in configure.in and run autoconf.  Add the 
    configure flag "--with-libedit-preferred".
    
    If the version of libedit used calls its "history.h" something other
    than history.h, place a symlink called history.h to it somewhere that
    the C preprocessor will check.
    
    o  Configure with "--without-readline"
    
    postgres can be configured with the option "--without-readline".  When
    this is enabled, postgres will not link against libreadline or libedit.
    psql will not have history, tab completion, or any of the other niceties
    that readline and libedit bring, but external readline wrappers exist
    that add that functionality.
    
    o  Use readline 5.0
    
    Readline 5.0 does not induce the problems, however it does export
    memcpy and strncpy when built using the easy method of "-bexpall".  Like
    4.3, it is possible to do a build that does not export these symbols,
    but it does take considerable manual effort and the creation of export
    files.
    
    References
    ----------
    "AIX 5L Porting Guide"
      IBM Redbook
      http://www.redbooks.ibm.com/redbooks/pdfs/sg246034.pdf
      http://www.redbooks.ibm.com/abstracts/sg246034.html?Open
      
    "Developing and Porting C and C++ Applications on AIX"
      IBM Redbook
      http://www.redbooks.ibm.com/redbooks/pdfs/sg245674.pdf
      http://www.redbooks.ibm.com/abstracts/sg245674.html?Open
    
    -----
    
    AIX Memory Management: An Overview
    ==================================
    
    by Seneca Cunningham...
    
    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.
    
    Two examples of AIX-specific memory problems
    --------------------------------------------
    Both examples were from systems with gigabytes of free RAM.
    
    a) createlang failing with unusual errors
        Running as the owner of the postgres install:
            -bash-3.00$ createlang plpgsql template1
            createlang: language installation failed: ERROR:  could not load library
            "/opt/dbs/pgsql748/lib/plpgsql.so": A memory address is not in the 
            address space for the process.
        
        Running as a non-owner in the group posessing the postgres install:
            -bash-3.00$ createlang plpgsql template1
            createlang: language installation failed: ERROR:  could not load library 
            "/opt/dbs/pgsql748/lib/plpgsql.so": Bad address
    
    b) out of memory errors in the postgres logs
        Every memory allocation near or greater than 256MB failing.
    
    
    The cause of these problems
    ----------------------------
    
    The overall cause of all these problems is the default bittedness and
    memory model used by the postmaster 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 4GB of memory laid out in 256MB segments using one of a
    few models.  The default allows for less than 256MB in the heap as it
    shares a single segment with the stack.
    
    In the case of example a), above, check your umask and the permissions
    of the binaries in your postgres install.  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.
    
    Solutions and workarounds
    -------------------------
    In this section, all build flag syntax is presented for gcc.
    
    The "ideal" solution for this is to use a 64-bit build of postgres,
    but that's not always practical.  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 postmaster 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
    postmaster to have $MAXDATA bytes set aside for the heap, allocated in
    256MB 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 might 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.  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.
    
    Overcommit
    ----------
    
    By default, overcommit of paging space can happen.  While I 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 I 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.
    
    References and resources
    ------------------------
    "Large Program Support"
      AIX Documentation: General Programming Concepts: Writing and Debugging Programs
      http://publib.boulder.ibm.com/infocenter/pseries/topic/com.ibm.aix.doc/aixprggd/genprogc/lrg_prg_support.htm
    
    "Program Address Space Overview"
      AIX Documentation: General Programming Concepts: Writing and Debugging Programs
      http://publib.boulder.ibm.com/infocenter/pseries/topic/com.ibm.aix.doc/aixprggd/genprogc/address_space.htm
    
    "Performance Overview of the Virtual Memory Manager (VMM)"
      AIX Documentation: Performance Management Guide
      http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/resmgmt2.htm
    
    "Page Space Allocation"
      AIX Documentation: Performance Management Guide
      http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/memperf7.htm
    
    "Paging-space thresholds tuning"
      AIX Documentation: Performance Management Guide
      http://publib.boulder.ibm.com/infocenter/pseries/v5r3/topic/com.ibm.aix.doc/aixbman/prftungd/memperf6.htm
    
    "Developing and Porting C and C++ Applications on AIX"
      IBM Redbook
      http://www.redbooks.ibm.com/redbooks/pdfs/sg245674.pdf
      http://www.redbooks.ibm.com/abstracts/sg245674.html?Open
    
    
    Statistics Collector Fun on AIX
    --------------------------------
    
    When implementing PostgreSQL version 8.1 on AIX 5.3, we periodically
    ran into problems where the statistics collector would "mysteriously"
    not come up successfully.
    
    This appears to be the result of unexpected behaviour in the IPv6
    implementation.  It looks like PostgreSQL and IPv6 do not play very
    well together at this time on AIX.
    
    Any of the following actions "fix" the problem.
    
    1.  Delete the localhost ipv6 address
    
    (as root)
    # ifconfig lo0 inet6 ::1/0 delete
    
    2.  Remove IPv6 from net services.  The file /etc/netsvc.conf, on AIX,
    is roughly equivalent to /etc/nsswitch.conf on Solaris/Linux.
    
    The default, on AIX, is thus:
    
      hosts=local,bind
    
    Replace this with:
    
      hosts=local4,bind4
    
    to deactivate searching for IPv6 addresses.
    
    
    Shared Linking
    --------------
    
    Shared libraries in AIX are different from shared libraries in Linux.
    
    A shared library on AIX is an 'ar' archive containing shared objects. A
    shared object is produced by the linker when invoked appropriately (e.g.
    with -G), it is what we call a shared library on Linux.
    
    -> On AIX, you can do a static as well as a dynamic
    -> link against a shared library, it depends on how you
    -> invoke the linker.
    
    When you link statically, the shared objects from the library are added
    to your executable as required; when you link dynamically, only
    references to the shared objects are included in the executable.
    
    Consequently you do not need a separate static library on AIX if you
    have a dynamic library.
    
    However, you CAN have static libraries (ar archives containing *.o
    files), and the linker will link against them. This will of course
    always be a static link.
    
    When the AIX linker searches for libraries to link, it will look for a
    library libxy.a as well as for a single shared object libxy.so when you
    tell it to -lyx. When it finds both in the same directory, it will
    prefer libpq.a unless invoked with -brtl.
    
    This is where the problem occurs:
    
    By default, PostgreSQL will (in the Linux way) create a shared object
    libpq.so and a static library libpq.a in the same directory.
    
    Up to now, since the linker was invoked without the -brtl flag, linking
    on AIX was always static, as the linker preferred libpq.a over libpq.so.
    
    We could have solved the problem by linking with -brtl on AIX, but we
    chose to go a more AIX-conforming way so that third party programs
    linking against PostgreSQL libraries will not be fooled into linking
    statically by default.
    
    The 'new way' on AIX is:
    - Create libxy.so.n as before from the static library
      libxy.a with the linker.
    - Remove libxy.a
    - Recreate libxy.a as a dynamic library with
      ar -cr libxy.a libxy.so.n
    - Only install libxy.a, do not install libxy.so
    
    Since linking is dynamic on AIX now, we have a new problem:
    
    We must make sure that the executable finds its library even if the
    library is not installed in one of the standard library paths (/usr/lib
    or /lib).
    
    On Linux this is done with an RPATH, on AIX the equivalent is LIBPATH
    that can be specified at link time with -blibpath:<colon separated path>
    . If you do not specify the LIBPATH, it is automatically computed from
    the -L arguments given to the linker. The LIBPATH, when set, must
    contain ALL directories where shared libraries should be searched,
    including the standard library directories.
    
    Makefile.aix has been changed to link executables with a LIBPATH that
    contains --libdir when PostgreSQL is configured with --enable-rpath (the
    default).
    
    The AIX equivalent for the Linux environment variable LD_LIBRARY_PATH is
    LIBPATH.
    
    The regression tests rely on LD_LIBRARY_PATH and have to be changed to
    set LIBPATH as well.
    
    Laurenz Albe