修改linux共享内存大小
这是实际linux系统显示的实际数据:
beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmax
33554432
beijibing@bjb-desktop:/proc/sys/kernel$ cat shmmni
4096
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmax
8192
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmni
622
beijibing@bjb-desktop:/proc/sys/kernel$ cat msgmnb
16384
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 sysptsize0x9 = 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 -
编译内核时需要把选项 SYSVSHM 和 SYSVSEM 打开。(缺省是打开的。)共享内存的最大尺寸是由选项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共享内存大小的更多相关文章
- Linux共享内存
1.什么是共享内存在前面讲虚拟内存机制时,有讲到Linux的内存映射机制:初始化虚拟内存区域时,会把虚拟内存和磁盘文件对象对应起来.由于内存映射机制,一个磁盘文件对象可被多个进程共享访问,也可被多个进 ...
- Linux 程序设计1:深入浅出 Linux 共享内存
笔者最近在阅读Aerospike 论文时,发现了Aerospike是利用了Linux 共享内存机制来实现的存储索引快速重建的.这种方式比传统利用索引文件进行快速重启的方式大大提高了效率.(减少了磁盘 ...
- Linux共享内存使用常见陷阱与分析
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式.是针对其他通信机制运行效率较低而设计的.往往与其它通信机制,如 信号量结合使用,来达到进程间的同步及互斥.其他进程能把同一段 ...
- linux共享内存的查看与删除
在使用共享内存的程序异常退出时,由于没有释放掉共享内存,在调试时会出现错误.您可以使用shell命令来查看与释放已经分配的共享内存,下面将详细说明如何进行查看和释放分配的共享内存的方法. 预备知识 L ...
- linux 共享内存shm_open实现进程间大数据交互
linux 共享内存shm_open实现进程间大数据交互 read.c #include <sys/types.h> #include <sys/stat.h> #includ ...
- linux 共享内存
共享内存是最高效的IPC机制,因为它不涉及进程之间的任何数据传输.这种高效带来的问题是,我们必须用其他手段来同步进程对共享内存的访问,否则会产生竞态条件.所以,共享内存通常和其他进程间通信方式一起使用 ...
- Linux共享内存(二)
Linux共享内存编程实例 原文链接:http://blog.csdn.net/pcliuguangtao/article/details/6526119 /*共享内存允许两个或多个进程进程共享同一块 ...
- 修改ActiveMQ的内存大小
有时我们需要修改ActiveMQ的内存大小,防止内存溢出! 修改配置文件下-Xmx参数然后重启mq即可: /fs01/apache-activemq-5.15.0/bin/env ACTIVEMQ_O ...
- ORACLE_修改实例的内存大小
注:本文来源于:星火spark <Oracle的实例占用内存调整> ORACLE_修改实例的内存大小 一:修改oracle数据库实例内存大小脚本 ---- 1.操作 (oracle使用内 ...
随机推荐
- 行人检測之HOG特征(Histograms of Oriented Gradients)
之前的文章行人计数.计次提到HOG特征这个概念,这两天看了一下原版的论文,了解了一下HOG特征的原理,并依据自己的理解将这种方法的流程写了下来,假设有不正确的地方欢迎指正. HOG(Histogram ...
- 移动支付之智能IC卡与Android手机进行NFC通信
本文来自http://blog.csdn.net/hellogv/ .引用必须注明出处. 眼下常见的智能IC卡执行着JavaCard虚拟机.智能IC卡上能够执行由精简后的Java语言编写 ...
- linux内核--内存管理(二)
一.进程与内存 所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不一而不尽相同,有些内 ...
- [Regular Expressions] Find Groups of Characters, and ?:
We'll capture groups of characters we wish to match, use quantifiers with those groups, and use refe ...
- Canvas绘图方法和图像处理方法(转)
转自:http://javascript.ruanyifeng.com/htmlapi/canvas.html 概述 Canvas API(画布)用于在网页实时生成图像,并且可以操作图像内容,基本上它 ...
- Git入门——基础知识问答
问题一:为什么要选择Git作为Android开发的版本控制工具? 答:1)git是android项目和社区的统一语言. 2)高通版本发布频繁,需要与平台及时同步,快速re ...
- Entity Framework Code First主外键关系映射约定
本篇随笔目录: 1.外键列名默认约定 2.一对多关系 3.一对一关系 4.多对多关系 5.一对多自反关系 6.多对多自反关系 在关系数据库中,不同表之间往往不是全部都单独存在,而是相互存在关联的.两个 ...
- Python3.5入门学习记录-File
在Python中,操作文件对象使用open函数来创建,下表列出了常用的操作file的函数: 序号 方法及描述 1.file.close() 关闭文件.关闭后文件不能再进行读写操作. 2.file.fl ...
- bat加载和分离VHD
VHD: vhd:虚拟磁盘格式 [详看 百科 ] 应用: 建立VHD文件,把系统装进VHD,然后从VHD启动. 优点: 因为系统在一个文件里,所以有可删,可移动,可快照的优点. VHD装系统方法: 请 ...
- Ubuntu14.04安装PostpreSQL9.3.5记录
安装参考:http://www.postgresql.org/download/linux/ubuntu/ y@y:~$ sudo apt-get install postgresql-9.3 pos ...