Re: OS X shared memory documentation - Mailing list pgsql-patches
From | Jim C. Nasby |
---|---|
Subject | Re: OS X shared memory documentation |
Date | |
Msg-id | 20060223005654.GS86022@pervasive.com Whole thread Raw |
In response to | Re: OS X shared memory documentation (Chris Campbell <chris@bignerdranch.com>) |
Responses |
Re: OS X shared memory documentation
|
List | pgsql-patches |
Outstanding writeup! Mind if I post it in our knowledgebase at http://www.pervasivepostgres.com/instantkb13/? (Unless someone has a better idea of where this could go...) On Sun, Feb 12, 2006 at 04:33:27PM -0500, Chris Campbell wrote: > The definitive answer can be found in the source code for the Darwin > kernel, xnu (links are below): > > 1. The shmmax, shmmin, shmmni, shmseg, and shmall settings cannot be > changed after the shared memory system is initialized > > 2. The shared memory system is initialized immediately after all 5 > settings have been configured > > 3. The shmall setting must be a multiple of the page size (on both > 10.3 and 10.4) > > Here are excerpts from the sysctl_shminfo() function found in > sysv_shm.c: > > [1] > /* Set the values only if shared memory is not initialised */ > if (!shm_inited) { > if ((error = SYSCTL_IN(req, arg1, sizeof(user_ssize_t))) > != 0) { > sysctl_shminfo_ret = error; > goto sysctl_shminfo_out; > } > > [2] > /* Initialize only when all values are set */ > if ((shminfo.shmmax != (user_ssize_t)-1) && > (shminfo.shmmin != (user_ssize_t)-1) && > (shminfo.shmmni != (user_ssize_t)-1) && > (shminfo.shmseg != (user_ssize_t)-1) && > (shminfo.shmall != (user_ssize_t)-1)) { > shminit(NULL); > } > > > [3] > (10.3) > if (arg1 == &shminfo.shmmax) { > if (shminfo.shmmax & PAGE_MASK) { > shminfo.shmmax = -1; > return(EINVAL); > } > } > > (10.4) > if (arg1 == &shminfo.shmmax) { > if (shminfo.shmmax & PAGE_MASK_64) { > shminfo.shmmax = -1; > return(EINVAL); > } > } > > PAGE_MASK is "(PAGE_SIZE - 1)", and PAGE_MASK_64 is simply "(unsigned > long long)PAGE_MASK" > > > /etc/rc contains commands to set all 5 of the parameters. In 10.3.9 > and later, you can place your own customized settings inside /etc/ > sysctl.conf that will be executed before /etc/rc's commands. But if > you don't set them all, the shared memory system isn't initialized, > and /etc/rc will overwrite them. > > Does that make sense? > > In a nutshell, if you want to customize the shared memory settings, > you must: > > (On 10.3.9 and later) > Set ALL 5 settings inside /etc/sysctl.conf, and make sure that shmmax > is a multiple of the page size (4096?). The page size is a runtime > variable that's set by kernel bootstrap mechanisms calling > vm_set_page_size() (I haven't tracked those down yet). > > (On earlier systems) > Modify the desired settings inside /etc/rc, and be aware that OS > updates will overwrite your changes. If you upgrade to 10.3.9, > migrate to using /etc/sysctl.conf. > > In my own OS X products that use a PostgreSQL server, I install an / > etc/sysctl.conf file on all servers. If installing on anything > earlier than 10.3, my installer modifies /etc/rc. That way, when the > customer upgrades their server to 10.3.9 and the /etc/rc file is > overwritten, the /etc/sysctl.conf file is already in place. > > Thanks! > > - Chris > > > Referenced source code: > > Mac OS X 10.4.4: > http://www.opensource.apple.com/darwinsource/10.4.4.ppc/ > xnu-792.6.56/bsd/kern/sysv_shm.c > > Mac OS X 10.3.9: > http://www.opensource.apple.com/darwinsource/10.3.9/xnu-517.12.7/ > bsd/kern/sysv_shm.c > > Mac OS X 10.3: > http://www.opensource.apple.com/darwinsource/10.3/xnu-517/bsd/ > kern/sysv_shm.c > -- Jim C. Nasby, Sr. Engineering Consultant jnasby@pervasive.com Pervasive Software http://pervasive.com work: 512-231-6117 vcard: http://jim.nasby.net/pervasive.vcf cell: 512-569-9461
pgsql-patches by date: