Re: OS X shared memory documentation

From: Chris Campbell <chris(at)bignerdranch(dot)com>
To: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
Cc: "Jim C(dot) Nasby" <jnasby(at)pervasive(dot)com>, pgsql-patches(at)postgresql(dot)org
Subject: Re: OS X shared memory documentation
Date: 2006-02-12 21:33:27
Views: Raw Message | Whole Thread | Download mbox
Lists: pgsql-patches
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  

     /* 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;

         /* 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)) {

         if (arg1 == &shminfo.shmmax) {
             if (shminfo.shmmax & PAGE_MASK) {
                 shminfo.shmmax = -1;

         if (arg1 == &shminfo.shmmax) {
             if (shminfo.shmmax & PAGE_MASK_64) {
                 shminfo.shmmax = -1;

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.


- Chris

Referenced source code:

Mac OS X 10.4.4: 

Mac OS X 10.3.9: 

Mac OS X 10.3: 

In response to


Browse pgsql-patches by date

  From Date Subject
Next Message Tom Lane 2006-02-12 23:24:52 Re: [GENERAL] Number format problem
Previous Message Bruce Momjian 2006-02-12 21:13:46 Re: [HACKERS] slow information schema with thausand users,