mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-29 22:49:41 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			494 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			494 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| =======================================================
 | |
| 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
 | |
| 
 |