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 |
Message-ID: | 6C06E93A-8276-4E6C-9F81-544495F70FFE@bignerdranch.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
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
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
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, |