解决zabbix的cannot allocate shared memory of size错误

2016年8月23日

这是因为内核对share memory的限制造成的。
用到如下命令ipcs [-m|l|a],sysctl [-a|p]

[root@server01 ~]# ipcs -l

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 0
max total shared memory (kbytes) = 0
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages: Limits --------
max queues system wide = 16
max size of message (bytes) = 65536
default max size of queue (bytes) = 65536

从上面可以看到max total shared memory和max seg size都是没有限制的。但是zabbix仍然不能allocate内存。

接下来查看目前的共享内存设置,

[root@server01 ~]# sysctl -a|grep shm
  1. kernel.shmmni = 4096
  2. kernel.shmall = 0
  3. kernel.shmmax = 0

其中kernel.shmall代表总共能分配的共享内存,kernel.shmax代表单个段能allocate的内存(以字节为单位),这里都是0,所以肯定有问题。

然后查看/etc/sysctl.conf

vim /etc/sysctl.conf
  1. kernel.shmmax = 1294967296
  2. kernel.shmall = 3294967296

linux 内存管理——内核的shmall 和shmmax 参数

内核的 shmall 和 shmmax 参数
SHMMAX= 配置了最大的内存segment的大小 ------>这个设置的比SGA_MAX_SIZE大比较好。
 
SHMMIN= 最小的内存segment的大小
 
SHMMNI= 整个系统的内存segment的总个数
 
SHMSEG= 每个进程可以使用的内存segment的最大个数
 
配置信号灯( semphore )的参数:
 
SEMMSL= 每个semphore set里面的semphore数量 -----> 这个设置大于你的process的个数吧,否则你不得不分多个semphore set,好像有process+n之说,我忘了n是几了。
 
SEMMNI= 整个系统的semphore set总数
 
SEMMNS=整个系统的semphore总数
 
shmall 是全部允许使用的共享内存大小,shmmax 是单个段允许使用的大小。这两个可以设置为内存的 90%。例如 16G 内存,16*1024*1024*1024*90% = 15461882265,shmall 的大小为 15461882265/4k(getconf PAGESIZE可得到) = 3774873。
修改 /etc/sysctl.conf
 
kernel.shmmax=15461882265
 
kernel.shmall=3774873
 
kernel.msgmax=65535
 
kernel.msgmnb=65535

执行 sudo sysctl -p   使之生效

在重启 zabbix-server

没有评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注