[GENERAL] Re: shared memory - Mailing list pgsql-general

From Daniel Kalchev
Subject [GENERAL] Re: shared memory
Date
Msg-id 199912210719.JAA24199@dcave.digsys.bg
Whole thread Raw
In response to shared memory  ("John Henderson" <jrh@is.com.fj>)
List pgsql-general
I have further researched this topic to find out that in the shmget man page
it says:

     [EINVAL]      Size specified is greater than the size of the previously
                   existing segment.  Size specified is less than the system
                   imposed minimum, or greater than the system imposed maxi-
                   mum.

This is the error you get.

However, what you get is not related to BSD/OS shared memory limits. My
'limit' errors were resolved by increased the BSD/OS kernel options as
described. I unsed to get the error:

IpcMemoryCreate: shmget failed (Cannot allocate memory) key=5432101,
size=3070976, permission=600

Note the diffrerent errors (in the parenthesis). Actually, the BSD/OS 3.x
shmget man page does not specify that ENOMEM (my problem) can be returned. :-)

Hope this helps find where this problem is - in my opinion PostgreSQL wrongly
makes assumptions about shared memory allocation, that might happen to work on
some platforms (e.g. Linux), but perhaps not on others.

Regards,
Daniel

>>>"John Henderson" said:
 > Hi y'all,
 > Here is the latest update.
 >
 > The problem is with PostgreSQL allocating shared memory in BSD/OS 3.0.
 > The system has 128M of RAM and 262M of swap.
 > Currently postgres starts as:
 >
 > su -l postgres -c '/usr/local/pgsql/bin/postmaster -i -d 3 -B 887 -o "-eF
 > -S 1024" >> /var/log/postgres 2>&1 &'
 >
 > without problems. However, try to start with -B 1024 (which allocates 1024
 > of 8K blocks used for shared memory buffers)
 > and the following is logged:
 >
 > FindExec: found "/usr/local/pgsql/bin/postgres" using argv[0]
 > binding ShmemCreate(key=52e2c1, size=8852184)
 > IpcMemoryCreate: shmget failed (Invalid argument) key=5432001, size=8852184,
 > per
 > mission=600
 > FATAL 1:  ShmemCreate: cannot create region
 > proc_exit(0) [#0]
 > shmem_exit(0) [#0]
 > exit(0)
 >
 > OK, so we have to get BSD/OS to allocate more shared memory.
 >
 > Note that the actual postgres error is related to calloc and malloc and
 > something else that specifically tells me to increase -B.
 > When -B is increased to 1024 the daemon dies as soon as it starts. The error
 > is not with memory usage but with memory allocation.
 >
 > In this case setting
 >
 > #options                        SYSVSHM
 > #options                        SYSVSEM
 > #options                        SYSVMSG
 >
 > have no value. In some older version of BSD these would tell the compiler to
 > include the optional shared memory header files which are automatically
 > included in this version of BSD so these configs are redundant.
 >
 > In previous attempts I have mucked with:
 > #options        "KMEMSIZE=\(16*1024*1024\)"
 > #options        "DFLDSIZ=\(32*1024*1024\)"
 > #options        "DFLSSIZ=\(4*1024*1024\)"
 > #options        "SOMAXCONN=128"
 > #options                "MAXDSIZ=\(256*1024*1024\)"
 > and made them available to the shell with ulimit. All to no avail.
 > Currently I use the default values from BSD so my front end processes get:
 > moe:~ $ ulimit -a
 > core file size (blocks)  unlimited
 > data seg size (kbytes)   32768
 > file size (blocks)       unlimited
 > max memory size (kbytes) 126280
 > stack size (kbytes)      32768
 > cpu time (seconds)       unlimited
 > max user processes       64
 > pipe size (512 bytes)    2
 > open files               128
 > virtual memory (kbytes)  65536
 >
 > The backend of PostgreSQL is booted from a script /etc/rc.postgres with
 > ulimit -d unlimited just before the daemon is started so I am assuming that
 > postgres gets lots of data space.
 > (In fact I have checked this out and it is true).
 >
 > Adjusting
 > #options                                "SHMMAXPGS=4096"
 > has no effect. The BSD default seems to be 2048 pages and pages are 4K.
 > That means the BSD default is around 8M which is just above my -B 886 (*8 =
 > 7.5M) allocation for shared memory.
 > Allowing the system to soak up some shared mem for whatever reason I would
 > say this is the variable that I have to adjust.
 > So why doesn't it adjust!!??
 > Sin'ichiro M from sdi-users suggested it might be related to semaphore
 > identifiers:
 > but when I used a config from Daniel Kalchev
 > options         "KMAPENTRIES=4000" #prevents kmem malloc errors
 > options                 "SHMMAXPGS=32768"
 > options                 "SHMMNI=400"
 > options                 "SHMSEG=204"
 > options                 "SEMMNS=600"
 > Nothing different happens.
 >
 > Finally there is a tip from Bruce that I need to increase SYSPTSIZE, the
 > number of dynamically allocated page tables for the kernel.
 > SYSPTSIZE is discovered by
 > bpatch -r sysptsize
 > In my case 28.
 > You can adjust this directly into the finished kernel by
 > bpatch sysptsize 40
 > Don't forget to reboot so that the change becomes effective.
 > This should actually allow me to allocate 12*4 = 48 extra Megs of shared
 > memory.
 > Guess what, no difference.
 >
 > Thanks to anyone who has read this far.
 > Here are some questions:
 > 1) What part of memory do shared memory buffers get loaded into: kernel?
 > data? This is to determine which of the ulimitable variables to concentrate
 > on.
 > 2) Is it universally agreed that SHMMAXPGS is the key variable to address
 > and we just need to figure out what is related directly to it?
 > 3) I don't have a clue - do you?
 > Best,
 > John Henderson
 >
 >
 >
 >



************


pgsql-general by date:

Previous
From: Ed Loehr
Date:
Subject: Re: [GENERAL] Setting up Postgres for production web/db work
Next
From: "Matthew Brown"
Date:
Subject: /usr/bin/wish required for install???