Postgres与OS内核相关的几个参数设置

Postgres在postgresql.conf里面的配置参数有几个是和OS的内核参数紧密相关的,通常默认值是偏小的,但设置过大也会造成Postgres的启动失败,官方文档(Part 17.3)有较详细的说明,但没有例子,这里给出实际示例。

测试环境:
DB: postgres 9.1.3
OS: CentOS 6.2 / Redhat
–内核参数文件位置:
/proc/sys/kernel
/etc/sysctl.conf
[root@localhost ~]# sysctl -a|more
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
kernel.msgmax = 65536
kernel.msgmni = 2005
kernel.msgmnb = 65536
[postgres@localhost ~]$ cat /proc/sys/kernel/sem
250 32000 32 128
(semmsl semmns semopm semmni)

1.shared_buffers VS shmget
shared_buffers是共享内存的意思,如果该值超过系统的内存值(包括swap),会造成启动失败
shmget是get share memory,它是创建一个共享内存的函数
[root@localhost ~]# free -m
total used free shared buffers cached
Mem: 1006 872 134 0 100 629
-/+ buffers/cache: 142 863
Swap: 2015 13 2002
[root@localhost ~]# su - postgres
[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf
shared_buffers = 5GB
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL: could not create shared memory segment: Cannot allocate memory
DETAIL: Failed system call was shmget(key=1949001, size=5609447424, 03600).
HINT: This error usually means that PostgreSQL’s request for a shared memory segment exceeded available memory or swap space, or exceeded your kernel’s SHMALL parameter. You can either reduce the request size or reconfigure the kernel with larger SHMALL. To reduce the request size (currently 5609447424 bytes), reduce PostgreSQL’s shared memory usage, perhaps by reducing shared_buffers or max_connections.
The PostgreSQL documentation contains more information about shared memory configuration.
解决办法是减小shared_buffers、max_connections值,也或者加大shmall值、shmax值、加大内存和swap,如果设置超大,大过内核值,则直接报错Invalid argument,如

[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf
shared_buffers = 222222GB
max_connections = 100
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL: invalid value for parameter “shared_buffers”: “222222GB”
HINT: Value exceeds integer range.
2.max_connections VS semget
max_connections是最大连接数,即允许客户端连接的最大连接数,增大连接可以允许接入更多的客户端,但设置过大同样会造成DB启动失败
semget是获取信号的一个函数,即get semaphore
[postgres@localhost ~]$ vi /database/pgdata/postgresql.conf
max_connections = 5000
[postgres@localhost ~]$ pg_start
server starting
[postgres@localhost ~]$ FATAL: could not create semaphores: No space left on device
DETAIL: Failed system call was semget(1949125, 17, 03600).
HINT: This error does not mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter. Alternatively, reduce PostgreSQL’s consumption of semaphores by reducing its max_connections parameter.
The PostgreSQL documentation contains more information about configuring your system for PostgreSQL.

上述的空间不够不是指的是磁盘空间不够,而是创建semaphores时空间参数不够,系统调用参数semget报错,但是错误信息感觉有些迷惑…解决办法通常是减小max_connections,或者增大内核参数,如semmni,semmns等,在/proc/sys/kernel/sem里面调整,如
[root@localhost ~]# sysctl -w kernel.sem=“500 64000 50 150”
kernel.sem = 500 64000 50 150
[root@localhost ~]# cat /proc/sys/kernel/sem
500 64000 50 150

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值