Re: OS X shared memory documentation - Mailing list pgsql-patches
From | Chris Campbell |
---|---|
Subject | Re: OS X shared memory documentation |
Date | |
Msg-id | 6C06E93A-8276-4E6C-9F81-544495F70FFE@bignerdranch.com Whole thread Raw |
In response to | Re: OS X shared memory documentation (Tom Lane <tgl@sss.pgh.pa.us>) |
Responses |
Re: OS X shared memory documentation
Re: OS X shared memory documentation |
List | 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 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
Attachment
pgsql-patches by date: