postgresql调优一:postgresql参数调优

 

 1。pg中性能相关常调参数数据库

  

 

参数名称 参数意义 优化思路
shared_buffers 数据库服务器将使用的共享内存缓冲区大小,该缓冲区为全部链接共用。从磁盘读入的数据(主要包括表和索引)都缓存在这里。 提升该值能够减小数据库的磁盘IO
work_mem 声明内部排序和哈希操做可以使用的工做内存大小。该内存是在开始使用临时磁盘文件以前使用的内存数目。数值以kB为单位的,缺省是 1024 (1MB)。请注意对于复杂的查询,可能会同时并发运行好几个排序或者哈希操做,每一个都会使用这个参数声明的这么多内存,而后才会开始求助于临时文件。一样,好几个正在运行的会话可能会同时进行排序操做。所以使用的总内存多是 work_mem 的好几倍。ORDER BY, DISTINCT mergejoin都要用到排序操做,而哈希操做在哈希链接、哈希汇集和以哈希为基础的 IN 子查询处理中都会用到。该参数是会话级参数。 执行排序操做时,会根据work_mem的大小决定是否将一个大的结果集拆分为几个小的和 work_mem差很少大小的临时文件写入外存。显然拆分的结果是致使了IO,下降了排序的速度。所以增长work_mem有助于提升排序的速度。一般设置时能够逐渐调大,知道数据库在排序的操做时不会有大量的写文件操做便可。该内存每一个链接一份,当并发链接较多时候,该值不宜过大。
effective_cache_size 优化器假设一个查询可使用的最大内存(包括pg使用的和操做系统缓存),和shared_buffer等内存无关,只是给优化器生成计划使用的一个假设值。 设置稍大,优化器更倾向使用索引扫描而不是顺序扫描,建议的设置为可用空闲内存的25%,这里的可用空闲内存指的是主机物理内存在运行pg时得空闲值。
maintenance_work_mem 这里定义的内存只是在CREATE INDEX, VACUUM等时用到,所以用到的频率不高,可是每每这些指令消耗比较多的资源,所以应该尽快让这些指令快速执行完毕。 在数据库导入数据后,执行建索引等操做时,能够调大,好比512M
wal_buffers 日志缓冲区,日志缓冲区的大小

两种状况下要酌情调大:1.单事务的数据修改量很大,产生的日志大于wal_buffers,为了不屡次IO,调大该值。缓存

2.系统中并发小数据量修改的短事务较多,而且设置了commit_delay,此时wal_buffers须要容纳多个事务(commit_siblings个)的日志,调大该值避免屡次IO
commit_delay 事务提交后,日志写到wal_buffer上到wal_buffer写到磁盘的时间间隔。 若是并发的非只读事务数目较多,能够适当增长该值,使日志缓冲区一次刷盘能够刷出较多的事务,减小IO次数,提升性能。须要和commit_sibling配合使用。
commit_siblings 触发commit_delay等待的并发事务数,也就是系统的并发活跃事务数达到了该值事务才会等待commit_delay的时间才将日志刷盘,若是系统中并发活跃事务达不到该值,commit_delay将不起做用,防止在系统并发压力较小的状况下事务提交后空等其余事务。 应根据系统并发写的负载配置。例如统计出系统并发执行增删改操做的平均链接数,设置该值为该平均链接数。
fsync 设置为on时,日志缓冲区刷盘时,须要确认已经将其写入了磁盘,设置为off时,由操做系统调度磁盘写的操做,能更好利用缓存机制,提升IO性能。 该性能的提升是伴随了数据丢失的风险,当操做系统或主机崩溃时,不保证刷出的日志是否真正写入了磁盘。应依据操做系统和主机的稳定性来配置。
autovacuum 是否开启自动清理进程(如开启须要同时设置参数stats_start_collector = onstats_row_level = on,),整理数据文件碎片,更新统计信息。 若是系统中有大量的增删改操做,建议打开自动清理进程,这样一方面能够增长数据文件的物理连续性,减小磁盘的随机IO,一方面能够随时更新数据库的统计信息,使优化器能够选择最优的查询计划获得最好的查询性能。若是系统中只有只读的事务,那么关闭自动清理进程。
autovacuum_naptime 自动清理进程执行清理分析的时间间隔 应该根据数据库的单位时间更新量来决定该值,通常来讲单位时间的更新量越大该时间间隔应该设置越短。因为自动清理对系统的开销较大,该值应该谨慎配置(不要太小)。
bgwriter_delay 后台写进程的自动执行时间 后台写进程的做用是将shared_buffer里的脏页面写回到磁盘,减小checkpoint的压力,若是系统数据修改的压力一直很大,建议将该时间间隔设置小一些,以避免积累的大量的脏页面到checkpoint,使checkpoint时间过长(checkpoint期间系统响应速度较慢)。
bgwriter_lru_maxpages 后台写进程一次写出的脏页面数 依据系统单位时间数据的增删改量来修改
bgwriter_lru_multiplier 后台写进程根据最近服务进程须要的buffer数量乘上这个比率估算出下次服务进程须要的buffer数量,在使用后台写进程写回脏页面,使缓冲区能使用的干净页面达到这个估计值。 依据系统单位时间数据的增删改量来修改。
     

 

2。 tpcc/压力测试时pg常调参数示例:服务器

 

max_connections = 200并发

 

#根据数据量尽可能调大shared_buffer值,把全部数据都放到内存中更好,高并发

#曾经在32G内存的服务器上把shared_buffert调到了26G 性能

#wal_buffers根据产生的wal日志量也适当设大点测试

shared_buffers=1200MB
wal_buffers = 2000kB优化

#work_mem要适可而止,每一个链接都要用这么大的spa

work_mem = 1024kB操作系统

#通常作作检查点的时间长于压力测试的时间,这样性能数据会更好,等压力测试完了再去作检查点吧。

Checkpoint_timeout=120min
 

bgwriter_delay = 10ms  
bgwriter_lru_maxpages = 75
full_page_writes = off
log_min_messages = fatal

#压力测试时因为高并发等锁的时间能够长一些

deadlock_timeout = 3s

 

#平时实践有些应用中把位图扫描和顺序扫描关了性能会更好 

enable_bitmapscan = off
enable_seqscan = off

 

#若是是只读的压力测试,还能够关掉没事的后台写进程等