Chinaunix首页 | 论坛 | 博客
  • 博客访问: 36510
  • 博文数量: 20
  • 博客积分: 915
  • 博客等级: 准尉
  • 技术积分: 175
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-08 16:08
文章分类

全部博文(20)

文章存档

2011年(1)

2009年(6)

2008年(13)

我的朋友
最近访客

分类: Oracle

2009-02-11 11:52:00

名字 描述n 合理取值
SHMMAX 最大共享内存段尺寸(字节) 512 kB + 8192 * 缓冲区数 + 额外 ... 无穷大
SHMMIN 最小共享内存段尺寸(字节) 1 (最多大约是 256 kB)
SHMSEG 每进程最大共享内存段数量 只需要 1 个段,不过缺省比这高得多.
SHMMNI 系统范围最大共享内存段数量 类似SHMSEG+ 用于其他应用的空间
SEMMNI 信号灯标识符的最小数量(也就是说,套) >= ceil(max_connections % 16)
SEMMNS 系统范围的最大信号灯数量 ceil(max_connections / 16) * 17 + 用于其他应用的空间
SEMMSL 每套信号灯最小信号灯数量 >= 17
SEMMAP 信号灯映射里的记录数量 参阅文本
SEMVMX 信号灯的最大值 >= 255 (缺省通常是32767,除非被要求,否则不要修改

最重要的共享内存参数是SHMMAX, 以字节记的共享内存段可拥有的最大尺寸. 如果你收到来自shmget的一行Invalid argument这样的错误信息,那么很有可能是你超过限制了. 要求的共享内存段随着请求的缓冲区数量(-B选项)和 允许的连接数量(-N选 项)的变化而变化,尽管前者是 主要因素. (因此,作为一种临时的解决方法,你可以降低这些设置来绕过失败.) 如果粗略地估计,你可以估计所需要的段尺寸是缓冲区数量乘以块 尺寸(缺省 8192KB)加上足够的盈余(至少半兆字节). 任何错误信息都会包含分配失败的尺寸.

不太可能出问题的是共享内存段的最小尺寸(SHMMIN), 对Postgres来说最多是 256 kB左右(通常只是 1),而 系统范围(SHMMNI)或每进程(SHMSEG) 最大共享内存段数量不应该会产生问题,除非你的系统把它们设成零. 有些系统还对系统里的共享内存总量有限制;参阅下面平台相关的指导.

Postgres每个允许的联接使用一个信号灯 (-N选项), 以 16 个为一套.每套信号灯还包含第十七个信号灯, 它里面存储一个“magic number(标志)”, 以避免和其他应用使用的信号灯集冲突. 系统里的最大信号灯数目是由SEMMNS设置的, 因此这个值应该至少和联接设置一样大,并且每十六个联接还要另外加一个. (参阅里面的公式.) 参数SEMMNI决定 系统里一次可以存在的信号灯集的数目.因此这个参数至少应该为ceil(max_connections % 16).降低允许的联接数目是一个临时的 绕开失败的方法,这个启动失败通常被来自函数semget()的错误响应 “No space left on device”搞得很让人迷惑.

有时候你还会发现有必要增大SEMMAP,使之至少按照SEMMNS配 置.这个参数定义信号灯资源映射的尺寸, 可用的每个连续的信号灯块在这个映射中存放一条记录. 每当一套信号灯被释放,那么它要么会加入到该映射中一条相连的 已释放的块的入口中,要么注册成一条新的入口.如果映射填满了碎片, 那么被释放的信号灯就丢失了(除非重起).因此时间长信号灯空间的碎片 了会导致可用的信号灯比应该有的信号灯少.

SEMMSL参数,决定一套信号灯里可以有多少信号灯,对于Postgres而言应该至少是 17.

许多设置与 “semaphore undo(信号灯恢复)”有关,比如SEMMNUSEMUME,这些与Postgres无关.

BSD/OS

共享内存.缺省时是只支持 4MB 的共享内存.请记住共享内存是不能分页的;它是 锁在 RAM 里面的.共享内存参数是:

#define SHMMAX		/* max shared memory segment size (bytes) */
#define SHMMIN /* min shared memory segment size (bytes) */
#define SHMMNI /* max number of shared memory identifiers */
#define SHMSEG /* max shared memory segments per process */
#define SHMALL /* max amount of shared memory (pages) */
要增加 postmaster 使用的缓冲区数量,向你的内核配置文件里增加下面 几行.SHMALL值为 1024 的时候代表 4MB 共享内存. 相应增加该值:
options "SHMALL=4096"
options "SHMMAX=(SHMALL*PAGE_SIZE)"

对于运行 4.1 或更新的版本的人,只需要编译内核并重起.对于运行 更早的版本的,请用bpatch找出当前内核的sysptsize值.它是启动的时候自动计算的.

$bpatch -r sysptsize0x9 = 9
另外,把SYSPTSIZE修改为一个硬代码值.用 bpatch 算出来的值,并且为你需要的每个额外的 4 MB 共享内存加 1.
options "SYSPTSIZE=13"
sysptsize不能用 sysctl 在运行时修改.

信号灯.你可能需要增加信号灯的数量.缺省时,Postgres分配 34 个信号灯.这个数量只是刚刚超过缺省的系统总数 60 的一半.

缺省值在/sys/sys/sem.h

#define SEMMNI  10              /* # of semaphore identifiers */

#define SEMMNS 60 /* # of semaphores in system */

#define SEMUME 10 /* max # of undo entries per process */

#define SEMMNU 30 /* # of undo structures in system */
在内核配置文件里设置你需要的值,比如:
options "SEMMNI=40"
options "SEMMNS=240"
options "SEMUME=40"
options "SEMMNU=120"
FreeBSD, OpenBSD

编译内核时 需要把选项SYSVSHMSYSVSEM打开. (缺省是打开的.) 共享内存的最大尺寸是由选项SHMMAXPGS(以页计). 下面显示了一个如何设置这些参数的例子:

options         SYSVSHM
options SHMMAXPGS=4096
options SHMSEG=256

options SYSVSEM
options SEMMNI=256
options SEMMNS=512
options SEMMNU=256
options SEMMAP=256
HP-UX

缺省设置看来对普通安装是足够的了. 在HP-UX10,SEMMNS的出厂缺省是 128, 可能对大的数据库节点来说太小了.

IPC 可以在System Administration Manager(系统管理器)(SAM)下面的Kernel ConfigurationConfigurable Parameters配置. 你配置完了以后敲Create A New Kernel选项.

Linux

在 2.2 内核里缺省的共享内存限制(SHMMAXSHMALL)都是 32 MB,但是你可以在proc文件系统里修改这些值(不用重起). 比如,要允许 128 MB:

$echo 134217728 >/proc/sys/kernel/shmall$echo 134217728 >/proc/sys/kernel/shmmax
你可以把这些命令放到一个引导时运行的脚本中.

另外,如果你的系统里有的话,你可以使用sysctl(8) 来控制这些参数. 查找一个叫/etc/sysctl.conf的文件,然后再它里面加下面 这样的几行:

kernel.shmall = 134217728
kernel.shmmax = 134217728
通常在引导的时候会处理这个文件, 但你也可以稍后明确调用sysctl

其他参数对任何应用来说都足够了. 如果你想自己查看,你可以看看下面几个文件:/usr/src/linux/include/asm-xxx/shmparam.h/usr/src/linux/include/linux/sem.h.

SCO OpenServer

缺省配置时,只允许每段 512KB 共享内存,大概只够-B 24 -N 12用的.要增大设置,首先进入/etc/conf/cf.d目录.要显示当前的以字节记的SHMMAX,运行

./configure -y SHMMAX
设置SHMMAX的新值:
./configure SHMMAX=value
这里value是你想设置的以字节记的新值. 设置完了以后SHMMAX重新制作内核
./link_unix
然后重起.
Solaris

至少到版本 2.6 为止,共享内存段的参数设置对Postgres来说是太低了.相关的设置可以在/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
你要重起系统令修改生效.

又见获取关于Solaris里面的共享内存的信息.

UnixWare

UnixWare7 上,缺省配置里的最大共享内存段是 512 kB. 这个数只够-B 24 -N 12用的.要显示SHMMAX的 当前值,运行

/etc/conf/bin/idtune -g SHMMAX
就会显示以字节记的当前的缺省的最小和最大值. 要给SHMMAX设置一个新值,运行:
/etc/conf/bin/idtune SHMMAXvalue
这里value是你想设置的以字节记的新值. 设置完SHMMAX后,重建内核
/etc/conf/bin/idbuild -B
然后重起.
阅读(429) | 评论(0) | 转发(0) |
0

上一篇:exp

下一篇:Oracle RAC SRVCTL 详细说明

给主人留下些什么吧!~~