文档章节

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

kenyon_君羊
 kenyon_君羊
发布于 2013/04/06 14:22
字数 889
阅读 8851
收藏 24
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
附参数说明

 Name  Desc  Reasonable Value
 shmmax  Maximum size of shared memory segment (bytes)  at least several megabytes (see text)
 shmmin  Minimum size of shared memory segment (bytes)  1
 shmall  Total amount of shared memory available (bytes or pages)  if bytes, same as SHMMAX; if pages, ceil(SHMMAX/PAGE_SIZE)
 shmseg  Maximum number of shared memory segments per process only 1 segment is needed, but the default is much higher
 shmmni Maximum number of shared memory segments system-wide like SHMSEG plus room for other applications
 semmni Maximum number of semaphore identifiers (i.e., sets) at least ceil((max_connections + autovacuum_max_workers + 4) / 16)
 semmns  Maximum number of semaphores system-wide ceil((max_connections + autovacuum_max_workers
+ 4) / 16) * 17 plus room for other applications
 semmsl  Maximum number of semaphores per set  at least 17
 semmap  Number of entries in semaphore map  see text
 semvmx  Maximum value of semaphore at least 1000 (The default is often 32767; do not change unless necessary)















 

 

 

 

 

 

 

共享内存的使用:

 usage  Approximate shared memory bytes
Connections   (1800 + 270 * max_locks_per_transaction) * max_connections
 Autovacuum workers  (1800 + 270 * max_locks_per_transaction) * autovacuum_max_workers
 Prepared  transactions  (770 + 270 * max_locks_per_transaction) * max_prepared_transactions
 Shared disk buffers  (block_size + 208) * shared_buffers
 Wal buffers  (wal_block_size + 8) * wal_buffers
Fixed space requirements 770KB

 

© 著作权归作者所有

共有 人打赏支持
kenyon_君羊
粉丝 500
博文 170
码字总数 121714
作品 0
杭州
其他
私信 提问
加载中

评论(10)

mark35
mark35

引用来自“宏哥”的评论

引用来自“mark35”的评论

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

work_mem 这个与查询(排序等)有关,每进程。 如果max_connections设置为100,那么总消耗内存上限将会是 100*work_mem (不考虑程序运行自消耗)

shared_buffers 你那儿可以设置为 3000MB
temp_buffers 我设置8MB
work_mem 根据你查询复杂度来增加,一般1MB,如果是OLAP可能要设置得足够大(20MB ?)
maintenance_work_mem 这个是维护进程占用,可设定成2000MB,大数值对vaccum操作有利

应该顶的是这个.

更正下 maintenance_work_mem是影响vacuum、导入数据等操作。一般来说同一时间只会跑一个进程,所以只要内存充裕设置大些对这些操作的速度有提升

另外,若查询消耗内存大于work_mem设定值那么程序会在 data/base/pgsql_tmp/ 目录下创建临时文件作为交换文件使用。可以考虑把这个目录指向单独的高速物理卷来加速,或者如果内存足够就直接挂到tmpfs上用内存来提速(要写脚本重启时在pgsql启动前先做挂接操作)
宏哥
宏哥

引用来自“mark35”的评论

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

work_mem 这个与查询(排序等)有关,每进程。 如果max_connections设置为100,那么总消耗内存上限将会是 100*work_mem (不考虑程序运行自消耗)

shared_buffers 你那儿可以设置为 3000MB
temp_buffers 我设置8MB
work_mem 根据你查询复杂度来增加,一般1MB,如果是OLAP可能要设置得足够大(20MB ?)
maintenance_work_mem 这个是维护进程占用,可设定成2000MB,大数值对vaccum操作有利

应该顶的是这个.
宏哥
宏哥

引用来自“mark35”的评论

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

PS, 基本上postgres只要设置work_mem这一个项目就搞定(单条)查询资源耗用。貌似只有mysql这垃圾才搞出一堆诸如key_buffer,max_allowed_packet, table_cache,sort_buffer_size,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size,thread_cache_size 等等让你眼花缭乱适合设置控的设置项,可再复杂高级还是一坨狗屎

相当好的指引, 我单独拷贝记录下来了.
kenyon_君羊
kenyon_君羊

引用来自“mark35”的评论

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

PS, 基本上postgres只要设置work_mem这一个项目就搞定(单条)查询资源耗用。貌似只有mysql这垃圾才搞出一堆诸如key_buffer,max_allowed_packet, table_cache,sort_buffer_size,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size,thread_cache_size 等等让你眼花缭乱适合设置控的设置项,可再复杂高级还是一坨狗屎

MYSQL的引擎比较多,参数相对也比较多
kenyon_君羊
kenyon_君羊

引用来自“mark35”的评论

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

work_mem 这个与查询(排序等)有关,每进程。 如果max_connections设置为100,那么总消耗内存上限将会是 100*work_mem (不考虑程序运行自消耗)

shared_buffers 你那儿可以设置为 3000MB
temp_buffers 我设置8MB
work_mem 根据你查询复杂度来增加,一般1MB,如果是OLAP可能要设置得足够大(20MB ?)
maintenance_work_mem 这个是维护进程占用,可设定成2000MB,大数值对vaccum操作有利

恩,大致如此,work_mem可适当调大一点,貌似9.3的版本将会允许参数值设置过大时启动DB
mark35
mark35

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

PS, 基本上postgres只要设置work_mem这一个项目就搞定(单条)查询资源耗用。貌似只有mysql这垃圾才搞出一堆诸如key_buffer,max_allowed_packet, table_cache,sort_buffer_size,read_buffer_size,read_rnd_buffer_size,myisam_sort_buffer_size,thread_cache_size 等等让你眼花缭乱适合设置控的设置项,可再复杂高级还是一坨狗屎
mark35
mark35

引用来自“宏哥”的评论

不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?

work_mem 这个与查询(排序等)有关,每进程。 如果max_connections设置为100,那么总消耗内存上限将会是 100*work_mem (不考虑程序运行自消耗)

shared_buffers 你那儿可以设置为 3000MB
temp_buffers 我设置8MB
work_mem 根据你查询复杂度来增加,一般1MB,如果是OLAP可能要设置得足够大(20MB ?)
maintenance_work_mem 这个是维护进程占用,可设定成2000MB,大数值对vaccum操作有利
宏哥
宏哥

引用来自“kenyon(君羊)”的评论

排序相关的参数是work_mem,较早版本是叫sort_mem的,可以临时设置 set work_mem = '20MB';shared_buffers文档参考是取20%~40%的内存(RAM),个人觉得你用16GB内存设置512MB或者1、2GB就够了,temp_buffers是使用tempory table时用到的,默认8MB,看你实际场景的临时表使用情况

thanks
kenyon_君羊
kenyon_君羊
排序相关的参数是work_mem,较早版本是叫sort_mem的,可以临时设置 set work_mem = '20MB';shared_buffers文档参考是取20%~40%的内存(RAM),个人觉得你用16GB内存设置512MB或者1、2GB就够了,temp_buffers是使用tempory table时用到的,默认8MB,看你实际场景的临时表使用情况
宏哥
宏哥
不错, 我一直搞不清几个参数的用处.
有没有直接一点, 如果16G内存, shared_buffers 和 temp_buffers 应该怎么设

哪个是和排序相关比较强的?
PostgreSQL checkpoint 相关参数优化设置与解释

标签 PostgreSQL , checkpoint , IO HANG 背景 数据库的检查点相关参数如何配置,能让数据库运行更加顺滑? 内存、磁盘能力如何搭配,能发挥更好的性能? OS的参数如何设置,能尽可能的降低大...

德哥
2018/04/18
0
0
PostgreSQL培训系列直播—第二章:安装

内容概要 1、介绍Linux环境的数据库相关内核参数、存储、文件系统、资源限制、CGROUP资源隔离等相关配置与优化 2、介绍Linux下PostgreSQL的编译安装 3、介绍Linux下PostgreSQL的rpm安装 目标...

德哥
03/18
0
0
PostgreSQL 垃圾版本引入的索引扫描性能下降诊断

标签 PostgreSQL , 索引 , 多版本 , 垃圾版本 , pageinspect 背景 首先介绍几个背景知识,由于这些背景知识的存在,所以在某些情况下索引扫描的性能可能会出现一些问题或抖动。 导致性能下降...

德哥
2018/04/18
0
0
Postgresql 数据库控制解析(一)

前面我们通过“探索postgresql数据库(一)”和“探索postgresql数据库(二)”基本了解了postgresql数据库。接下来本文开始介绍下数据库控制(server control)。。 一、手动开启数据库(S...

章郎虫
2013/10/23
0
0
PostgreSQL DBA(2) - 数据库参数设置#2

本节简单介绍了PostgreSQL数据库的参数设置,包括参数的含义以及参数的推荐设置等。 典型的,假设数据库主机OS为Linux 64bit,内存为8G,存储阵列使用RAID 5(带宽约为200MB/s,IOPS约为200),主机没...

EthanHe
2018/08/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

winscp中使用sudo的方法

用截图了解如何在 WinSCP 中使用 sudo。 首先你需要检查你尝试使用 WinSCP 连接的 sftp 服务器的二进制文件的位置。 你可以使用以下命令检查 SFTP 服务器二进制文件位置: [root@kerneltalk...

Linux就该这么学
22分钟前
1
0
四、MyBatis中查询执行流程

一、查询执行大致流程 在MyBatis中,查询执行的大致流程如下:

yangjianzhou
28分钟前
1
0
系统幂等设计

前言 幂等简单的定义: 系统中的多次操作,不管多少次,都应该产生一样的效果,或返回一样的效果。 比如实际的业务请求为创建一个活动,理论上需要根据业务形态开发幂等创建活动的接口,这样...

春哥大魔王的博客
53分钟前
2
0
DevSecOps 运维模式中的安全性

导读 本文想从技术的角度谈谈我对云计算数据中心 DevSecOps 运维模式中的安全性的理解,和过去几年我在云服务业务连续性管理方面的探索。 现在公有云服务商都不约而同地转向 DevSecOps 模式。...

问题终结者
55分钟前
0
0
java 基础脑图 转载来的

NotFound403
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部