在 OS X 10.2 以及更造版本里, 编辑文件 /System/Library/StartupItems/SystemTuning/SystemTuning 并且用下列命令修改这些数值:
sysctl -w kern.sysv.shmmax
sysctl -w kern.sysv.shmmin
sysctl -w kern.sysv.shmmni
sysctl -w kern.sysv.shmseg
sysctl -w kern.sysv.shmall
在 OS X 10.3 里,这些命令移动到 /etc/rc 里面去了,必须在那里编辑。 你需要重新启动才能让设置生效。请注意 /etc/rc 通常会被 OS X 更新覆盖 (比如 10.3.6 到 10.3.7),所以每次更新后你可能都需要重新编辑。
在这个平台上,SHMALL 是用 4KB 页来度量的。
SCO OpenServer
缺省配置时,只允许每段 512KB 共享内存,大概只够 -B 24 -N 12用的。 要增大设置,首先进入 /etc/conf/cf.d目录。 要显示当前的以字节记的 SHMMAX,运行
./configure -y SHMMAX
设置 SHMMAX的新值:
./configure SHMMAX=value
这里 value 是你想设置的以字节记的新值。 设置完了以后SHMMAX重新制作内核
./link_unix
然后重起。
AIX
至少对于版本 5.1 而言,我们有必要为类似 SHMMAX 这样的参数做特殊的配置, 因为这个参数可以配置为所有内容都当作共享内存使用。这就是类似 DB/2 这样的数据库常用的配置。
不过,我们可能有必要在 /etc/security/limits 里面修改全局 ulimit ulimit 信息,因为文件大小的缺省硬限制(fsize)以及文件数(nofiles)可能太低了。
Solaris
至少到版本 2.6 为止,共享内存段的缺省最大设置对 PostgreSQL 来说是太低了。相关的设置可以在/etc/system里面修改, 例如:
set shmsys:shminfo_shmmax=0x2000000
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=256
set shmsys:shminfo_shmseg=256
set semsys:seminfo_semmap=256
set semsys:seminfo_semmni=512
set semsys:seminfo_semmns=512
set semsys:seminfo_semmsl=32
你要重起系统令修改生效。
又见
http://sunsite.uakom.sk/sunworld ... -insidesolaris.html 获取关于 Solaris 里面的共享内存的信息。
UnixWare
在 UnixWare 7 上,缺省配置里的最大共享内存段是 512 kB。 这个数只够-B 24 -N 12用的。要显示SHMMAX的当前值,运行
/etc/conf/bin/idtune -g SHMMAX
就会显示以字节记的当前的缺省的最小和最大值。 要给SHMMAX设置一个新值,运行:
/etc/conf/bin/idtune SHMMAX value
这里 value是你想设置的以字节记的新值。 设置完SHMMAX后,重建内核
/etc/conf/bin/idbuild -B
然后重起。
16.5.2. 资源限制
Unix 类系统强制了许多资源限制,这些限制可能干扰你的 PostgreSQL 服务器的运行。 这里尤其重要是对每个用户的进程数目的限制,每个进程打开文件数目, 以及每个进程可用的内存。 这些限制中每个都有一个"硬"限制和一个"软"限制。 软限制实际是管用的,但用户可以自己修改成最大为硬限制的数目。 而硬限制是只能由 root 用户修改的限制。 系统调用 setrlimit 负责设置这些参数。 shell 的内建命令 ulimit(Bourne shells) 或limit (csh) 就是用于在命令行上控制资源限制的。 在 BSD 衍生的系统上,文件/etc/login.conf 控制在登录时对各种资源设置什么样的限制数值。参阅操作系统文档获取细节。 相关的参数是 maxproc, openfiles,和 datasize。 比如:
default:\
...
:datasize-cur=256M:\
:maxproc-cur=256:\

penfiles-cur=256:\
...
(-cur 是软限制,后面附加 -max 就可以设置硬限制。)
内核通常也有一些系统范围的资源限制。
*
在 Linux 上, /proc/sys/fs/file-max 决定内核可以支持的最大文件数。 你可以通过往该文件写入一个不同的数值修改此值, 或者在 /etc/sysctl.conf 里增加一个赋值。 每个进程的最大打开文件限制是在编译内核的时候固定的; 参阅 /usr/src/linux/Documentation/proc.txt 获取更多信息。
PostgreSQL 服务器每个联接都使用一个进程, 所以你应该至少允许和联接数相同的进程数,再加上你的系统其它部分所需要的数目。 通常这个并不是什么问题,但如果你在一台机器上运行多个服务器,那你就要把事情理清楚。
打开文件数目的出厂缺省设置通常设置为"社会友好"数值,就是说允许许多用户共存于一台机器, 而不会导致只使用系统资源的不当比例。如果你在一台机器上运行许多服务器,这也许就是你想要的,但是在特殊的服务器上,你可能需要提高这个限制。
问题的另外一边,一些系统允许独立的进程打开非常多的文件;如果有那么几个进程这么干,那系统范围的上限就很容易达到。 如果你发现这样的现象,并且不想修改系统范围的限制, 你就可以把 PostgreSQL 的 max_files_per_process 配置参数来限制打开文件数的消耗。
16.5.3. Linux 内存过提交
在 Linux 2.4 以及之后的版本里,缺省的虚拟内存的行为不是对 PostgreSQL 最优的。 原因事内核实现内存过提交的方法,如果其它进程的内存请求导致系统用光虚拟内存, 那么内核可能会终止 PostgreSQL 服务器(postmaster进程)。
如果发生了这样的事情,你会看到想下面这样的内核信息(参考你的系统文档和配置,看看在哪里能看到这样的信息):
Out of Memory: Killed process 12345 (postmaster).
这就表明 postmaster 因为内存压力而终止了。 尽管现有的数据连接将继续正常运转,但是新的连接将无法接受。 要想恢复,你应该重启 PostgreSQL。
一个避免这个问题的方法是在一台你确信不会因为其它进程而耗尽内存的机器上运行 PostgreSQL。
在 Linux 2.6 以及以后的版本里,一个更好的解决方法是修改内存的行为, 这样它就不会再"过提交"内存。这是通过用 sysctl 选取一个严格的过提交模式实现的:
sysctl -w vm.overcommit_memory=2
或者在 /etc/sysctl.conf 里放一个等效的条目。 你可能还希望修改相关的设置 vm.overcommit_ratio。 详细信息请参阅内核文档文件 Documentation/vm/overcommit-accounting。
有些供应商的 Linux 2.4 内核有着早期 2.6 过提交的 sysctl。 不过,在没有相关代码的内核里设置 vm.overcommit_memory 为 2 只会让事情更糟,而不是更好。 我们建议你检查一下实际的内核源代码(参阅文件 mm/mmap.c 里面的 vm_enough_memory 函数), 核实一下这个是在你的版本里存在的,然后再在 2.4 内核里使用这个特性。 文档文件 overcommit-accounting 的存在不能当作是这个特性存在的证明。 如果有问题,请询问你的内核供应商的专家。