`

linux下更改共享内存的最大值

阅读更多

System V IPC 参数

名字 描述 合理取值
SHMMAX 最大共享内存段尺寸(字节) 最少若干兆(见文本)
SHMMIN 最小共享内存段尺寸(字节) 1
SHMALL 可用共享内存的总数量(字节或者页面) 如果是字节,就和 SHMMAX 一样;如果是页面,ceil(SHMMAX/PAGE_SIZE)
SHMSEG 每进程最大共享内存段数量 只需要 1 个段,不过缺省比这高得多。
SHMMNI 系统范围最大共享内存段数量 类似 SHMSEG 加上用于其他应用的空间
SEMMNI 信号灯标识符的最小数量(也就是说,套) 至少ceil(max_connections / 16)
SEMMNS 系统范围的最大信号灯数量 ceil(max_connections / 16) * 17 加 上用于其他应用的空间
SEMMSL 每套信号灯最小信号灯数量 至少 17
SEMMAP 信号灯映射里的记录数量 参阅文本
SEMVMX 信号灯的最大值 至少 1000 (缺省通常是32767,除非被迫,否则不要修改)

最重要的共享内存参数是 SHMMAX , 以字节记的共享内存段可拥有的最大尺寸。 如果你收到来自shmget 的类似Invalid argument 这样的错误信息,那么很有可能是你超过限制了。

有些系统对系统里面共享内存的总数(SHMALL )还有限制。 请注意这个数值必须足够大。 (注意:SHMALL 在很多系统上是用页面数,而不是字节数来计算的。)

系统里的最大信号灯数目是由SEMMNS 设置的, 因此这个值应该至少和 max_connections 设置一样大,并且每十六个联接还要另外加一个。  参数SEMMNI 决定系统里一次可以存在的信 号灯集的数目。 因此这个参数至少应该为 ceil(max_connections % 16) 。 降低允许的联接数目是一个临时的绕开失败的方法,这个启动失败通常被来自函数semget 的错误响应 No space left on device 搞得很让人迷惑。

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

SEMMSL 参数,决定一套信号灯里可以有多少信号灯,

更改方法

Linux

缺省设置只适合小安装(缺省最大共享内存是 32 MB)。不过,其它的缺省值都相当大, 通常不需要改变。最大的共享内存段设置可以用 sysctl 接口设置。 比如,要允许 128 MB,并且最大的总共享内存数为 2097152 页(缺省):

$

 sysctl -w kernel.shmmax=134217728



$

 sysctl -w kernel.shmall=2097152

你可以把这些设置放到 /etc/sysctl.conf 里,在重启后保持有效。

老版本里可能没有 sysctl 程序, 但是同样的改变可以通过操作 /proc 文件系统来做:

$

 echo 134217728 >/proc/sys/kernel/shmmax



$

 echo 2097152 >/proc/sys/kernel/shmall

另外可行的方法:

修改方法如下:修改/etc/rc.d/rc.local文件。

在文件的前面注释的后面加入以下行:

#修改内核共享内存大小;

echo134217728>/proc/sys/kernel/shmmax;

#说明:这里的值为内存的一半;

#如果系统内存是256M,则值为134217728;

#如果系统内存是512M,则值为268435456;

修改完成以后,重起机器就搞定。

 

其它系统的修改方法

MacOS X

在 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 页来度量的。 还要注意有些版本的 OS X 将拒绝把 SHMMAX 的数值数值为非 4096 的倍数。

SCO OpenServer

缺省配置时,只允许每段 512KB 共享内存。 要增大设置,首先进入 /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/sunworldonline/swol-09-1997/swol-09-insidesolaris.html 获取关于 Solaris 里面的共享内存的信息。

UnixWare

UnixWare 7 上,缺省配置里的最大共享内存段是 512 kB。 要显示SHMMAX 的当前值, 运行

/etc/conf/bin/idtune -g SHMMAX

就会显示以字节记的当前的缺省的最小和最大值。 要给SHMMAX 设 置一个新值,运行:

/etc/conf/bin/idtune SHMMAX value



这里 value 是你想设置的以字节记的新值。 设置完SHMMAX 后,重建内核

/etc/conf/bin/idbuild -B

然后重起。

 

BSD/OS

共享内存. 缺省时是只支持 4 MB 的共享内存。请记住共享内存是不能分页的;它是锁在 RAM 里面的。 要增加你的系统支持的共享缓冲区数目,向你的内核配置文件里增加下面的行:

options "SHMALL=8192"

options "SHMMAX=\(SHMALL*PAGE_SIZE\)"

SHMALL 以 4KB 页为单位计算,所以 1024 页面代表 4 M 共享内存。 所以上面的东西把共享内存区域增加到 32 MB。 对于运行 4.3 或者更新版本的人,你可能需要增大 KERNEL_VIRTUAL_MB , 超过缺省的 248 。 做完上面的修改之后,然后编译内核并重起。

对于运行 4.0 或者更早的版本的, 请用 bpatch 找出当前内核的 sysptsize 值。它是启动的时候动态计算的。

$ bpatch -r sysptsize



0x9 = 9

然后,把 SYSPTSIZE 修改为在内核配置文件里的一个硬代码值。 用 bpatch 算出来的值,并且为你需要的每个额外的 4 MB 共享内存再加 1。

options "SYSPTSIZE=16"

sysptsize 不能用 sysctl 修改。

信号灯. 你可能还需要增加信号灯的数量;系统缺省的总数 60 只能允许大概 50 个 PostgreSQL 连接。 在内核配置文件里设置你需要的值,比如:

options "SEMMNI=40"

options "SEMMNS=240"
FreeBSD

缺省设置只适合于很小的安装(比如,缺省 SHMMAX 是 32 MB)。 我们可以用 sysctl 或者 loader 接口来修改。 下面的参数可以用 sysctl 设置:

$

 sysctl -w kern.ipc.shmall=32768



$

 sysctl -w kern.ipc.shmmax=134217728



$

 sysctl -w kern.ipc.semmap=256

要想让这些设置重启后有效,修改 /etc/sysctl.conf

如果用 sysctl ,那么剩下的信号灯设置是只读的, 但是信号灯可以在启动的时候,在 loader 提示符下设置:

(loader)

 set kern.ipc.semmni=256



(loader)

 set kern.ipc.semmns=512



(loader)

 set kern.ipc.semmnu=256

类似的,这些东西可以在 /boot/loader.conf 中保存, 以便重启之后依然有效。

你可能还想配置内核,让把共享内存装载到 RAM 里,避免他们被交换到交换分区中。 这些可以通过使用 sysctl 设置 kern.ipc.shm_use_phys 来实现。

在 4.0 之前的 FreeBSD 版本类似 NetBSD OpenBSD (见下文)。

NetBSD
OpenBSD

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

options         SYSVSHM

options         SHMMAXPGS=4096

options         SHMSEG=256



options         SYSVSEM

options         SEMMNI=256

options         SEMMNS=512

options         SEMMNU=256

options         SEMMAP=256

你可能原意使用 sysctl 设置将共享内存锁在 RAM 中以避免它们被交换出去, 我们可以用 sysctl 设置 kern.ipc.shm_use_phys 来实现这个目的。

HP-UX

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

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

分享到:
评论

相关推荐

    linux操作系统修改共享内存的简单方法

    在优化oracle的时候,遇到了oracle的SGA大小远远大于linux系统共享 内存的最大值,以至于当用ipcs命令查看的时候,oracle的SGA区被分成了10个段,这大大影响的oracle的反应速度。本文将为大家介绍linux操作系统修改...

    linux共享内存

    总结来说,Linux下的共享内存提供了高效的数据共享手段,通过ftok()、shmget()、shmat()、shmdt()和shmctl()这五个主要的接口函数,实现了跨进程的数据交互。理解和熟练使用这些函数对于进行高性能的多进程通信至关...

    Linux内核分析-内存篇

    `memory_end`标识主内存的结束地址,最大值可能达到16MB。 - **高速缓存**(High-speed Cache):用于临时存储频繁访问的数据,以减少对主内存的访问次数。 - **RAM**:即随机访问存储器,是计算机的主内存区域。 #...

    linux内核参数修改

    linux内核参数修改 linux 内核 参数 修改 /proc/sys/kernel/shmall 该文件是在任何给定时刻系统上可以使用的共享内存的总量(以字节为单位)。 缺省设置:2097152 /proc/sys/kernel/shmax 该文件指定内核所允许的...

    linux 下安装oracle

    - `kernel.sem=250 32000 100`:信号量集的最大数量,每种信号量的最大值和信号量的总数。 以上参数的调整有助于优化Oracle在Linux环境下的运行效率。 #### 三、总结 本文详细介绍了在Linux环境下安装Oracle...

    Linux系统下快速配置HugePages的完整步骤

    在Linux系统中,HugePages是一种优化内存管理的技术,它允许操作系统分配连续的大块物理内存,从而减少或消除页面映射表(页表)的开销,提高内存访问效率,尤其是对于那些需要大量连续内存的高性能应用,如数据库...

    Linux下安装Oracle11g服务器

    例如,设置共享内存的最大值为***字节,信号量的最大数量为***等。这些参数的调整对于数据库的性能和稳定性至关重要。 在修改了sysctl.conf文件后,为了让这些更改立即生效,需要执行sysctl -p命令。这一步骤将会...

    Linux下安装Oracle详细过程

    安装前的最后一步是修改系统的核心参数,这通常涉及到调整共享内存、最大共享内存、最大共享内存节点和文件描述符的最大数量。这些可以通过向`/proc/sys`下的相应文件写入值来完成。 配置环境变量是另一个关键步骤...

    linux下oracle优化

    在Linux环境下运行Oracle数据库时,优化系统参数是确保数据库高效运行的关键步骤。Oracle数据库的性能很大程度上取决于操作系统级别的配置,特别是内核参数。以下是一些关键的内核参数及其优化建议,这些参数对于...

    Linux 下安装oacle 内核参数详解

    3. **kernel.shmall**: 它表示系统可以分配的所有共享内存段的总和的最大值,以页为单位。其值应不小于`shmmax/page_size`,其中page_size是系统的页面大小。默认值2097152页代表大约8GB的共享内存。如果所有Oracle...

    打通Linux脉络系列:进程、内存与IO111.pdf

    进程标识符(PID)用于唯一标识一个进程,而`pid_max`定义了系统中进程ID的最大值。在默认情况下,Linux系统的`pid_max`值为32768。当系统资源紧张时,可以通过调整`/proc/sys/kernel/pid_max`的值来增加可创建的...

    Linux下安装Oracle 11g详细步骤

    - `kernel.shmmax=68719476736`:定义单个共享内存段的最大值。应设置得足够大以容纳整个SGA。 - `kernel.shmmni=4096`:共享内存段的最大数量,默认值通常足够。 - `kernel.sem=250 32000 100 128`:这些参数分别...

    linux命令行下安装oracle10G

    在 Linux 命令行下安装 Oracle 10g 需要进行一些准备工作,包括选择安装环境的语言、修改 gennttab、修改内核参数、为 Oracle 创建 DBA 组和用户。安装 Oracle 10g 可以使用静默模式,配置完成后,可以使用 Oracle ...

    linux下oracle安装

    Linux下的Oracle数据库安装指南 在Linux操作系统中安装Oracle数据库是一个涉及多步骤的过程,需要对操作系统和数据库软件有一定程度的理解。以下是一份针对新手的详细安装说明。 首先,我们需要关注的是内核参数...

    linux下手工安装ORACLE 10G数据库

    ### Linux 下手工安装 Oracle 10G 数据库详解 #### 一、安装前的准备 在开始安装 Oracle 10G 数据库之前,确保你已经做好了充分的准备工作。这一步非常重要,因为良好的开端能够避免许多潜在的问题。 ##### 1. ...

    linux内核参数详解

    本文将深入探讨Linux内核参数中的“System V IPC”相关参数,特别是与共享内存和信号灯有关的配置项,以帮助用户更好地管理和优化Linux系统的资源。 #### 二、共享内存和信号灯简介 共享内存和信号灯是System V ...

    linux下安装oracle

    ### Linux下安装Oracle 10g 的详细步骤与说明 #### 一、硬件与系统要求 1. **硬件要求**: - 最小RAM:512MB - 最小交换空间:1GB - 对于RAM小于或等于2GB的系统,交换空间应为RAM数量的两倍; - 对于RAM大于2GB...

    突破Window共享人数限制2.7z

    1. **修改注册表**:通过编辑注册表键`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters`下的`MaxWorkItems`值。根据你的硬件配置(尤其是CPU核心数),你可以将此值设得更高,以支持...

    Linux下oracle11g

    - `kernel.shmmni = 4096`:共享内存段的数量。 - `kernel.sem`:设置信号量参数。 - `fs.file-max`:系统可以打开的最大文件数。 - `net.ipv4.ip_local_port_range`:定义本地TCP端口范围。 - `...

    Redhat Linux下Oracle 10g安装说明

    在Redhat Linux环境下安装Oracle 10g是一项技术性较强的任务,涉及到多个步骤和系统配置。以下是详细的安装过程和需要注意的知识点: 1. **系统需求与检查**: - **内存**:Oracle 10g对内存有较高要求,推荐至少...

Global site tag (gtag.js) - Google Analytics