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