Shared_buffer

1、什么是shared_buffer?

shared_buffer数据页缓冲区。


2、为什么要引入shared_buffer?

在数据库系统中,我们主要关注磁盘IO, 大部分oltp工作负载都是随机IO,因此从磁盘获取非常慢。为了解决这个问题,postgre将数据缓存在RAM中,来提高性能。postgresql在查询前,会先查找shared_buffer的页,如果命中,就直接返回,避免从磁盘中查询。


3、为什么要修改shared_buffer参数的值?

由于PostgreSQL的设计原则是确保在所有受支持的机器和操作系统上兼容,因此默认情况下这个值被保守地设置为较低。因此,在大多数现代操作系统上,更新shared_buffers是提高整体性能最有效的设置之一。


4、shared_buffer的值应该设置为多少?

对于shared_buffers,没有一个特定的推荐值。但是一般来说,对于专用DB服务器,shared_buffers的值应该大约是系统总RAM的25%。




Wal_buffer

1、什么是wal buffer?

wal buffer是预写日志(wal)缓冲区


2、wal_buffer应该设置为多大?

缓冲区的默认大小由wal_buffers设置设置—最初为16MB。如果要调优的系统有大量并发连接,那么wal_buffers的值越高,性能越好。




effective_cache_size


1、什么是effective_cache_size?


effective_cache_size 参数为 PostgreSQL 提供了一个可供操作系统和数据库使用的缓存估值


2、怎么理解这个缓存估值?


对于这个问题,我们首先要弄清楚,操作系统上的内存使用是怎么回事。

假设我们服务器一共有100gb内存,2 GB可能被操作系统占用,同时我们给了25gb给shared_buffer,同时PG可能还需要一些内存对数据进行排序,保持数据库连接等。假设之这些一共需要30GB。

那么还剩下差不多70GB要怎么分配呢?

答案是:其中一些可能是空闲的,但是大部分将最终作为文件系统缓存。

每当Linux执行I/O时,如果文件系统缓存周围有足够的空闲内存,就会开始缓存数据,尽可能避免磁盘I/O。文件系统是至关重要的,可以根据需要动态地改变大小。如果PostgreSQL需要更多的RAM来排序数据,它会分配内存,这反过来会使操作系统根据需要收缩文件系统缓存,以确保效率。



图片来源:https://www.cybertec-postgresql.com/en/effective_cache_size-what-it-means-in-postgresql/


2、effective_cache_size的作用是什么?



这个值仅由PostgreSQL查询规划器使用,以确定它所考虑的计划是否应该适合RAM。

在PG中,优化器负责确保查询以最有效的方式执行。然而,要做到这一点,有必要知道实际有多少内存。系统知道它自己的内存(= shared_buffers)的大小,但是文件系统缓存呢?那你的RAID控制器呢?如果优化器知道所有这些资源,不是很酷吗?

这正是effective_cache_size所要做的。它有助于查询规划器确定实际缓存的数量,并有助于调整I/O缓存。

具体点就是:如果effecve_cache_size的值太低,那么查询规划器可能会决定不使用某些索引。所以换句话说,这个值是PG用来估计索引的成本用的。它并不是实际的分配值。


3、effective_cache_size的大小应该设置为多大?


effective_cache_size的保守值是系统上可用内存总量的1/2。最常见的情况是,该值被设置为专用DB服务器上系统总内存的75%,但根据特定服务器工作负载上的特定离散需求,该值可以有所不同。




work_mem

1、什么是work_mem?

work_mem的值用于复杂的排序操作,并定义用于中间结果(如哈希表)和排序的最大内存量。


2、调优work_mem的好处是什么?

当调优了work_mem的值后,大部分排序操作将在更快的内存中执行,而不是在磁盘上进行写和读操作。


3、work_mem应该设置为大?

work_mem值不要设置得太高,因为当应用程序执行排序操作时,它可能会造成系统上可用内存的“瓶颈”。理想的做法是将work_mem的全局值设置为一个相对较低的值,然后修改任何特定的查询本身,使用更高的work_mem值。

例如:

SET LOCAL work_mem = '256MB';SELECT * FROM db ORDER BY ID;



maintenance_work_mem


1、什么是maintenance_work_mem?

maintenance_work_mem指定用于例行维护任务(如VACUUM、CREATE INDEX等)的内存使用量。


2、maintenance_work_mem应该设置为多大?

与work_mem不同的是,数据库会话一次只能执行这些维护操作中的一个。因此,大多数系统不会并发运行许多这样的进程,因此,将这个值设置为比work_mem大得多通常是安全的,因为更大的可用内存可以提高清理和恢复数据库转储的性能。

maintenance_work_mem默认值为64MB。




最后:

上面的介绍几个参数的大小设置,只是一个大概的值,在生产环境,这些值应该是基于特定工作负载进行基准测试之后的权衡值。

https://mp.weixin.qq.com/s/CBRO1ms_YmqbUO2X_F3a0g