• 售前

  • 售后

热门帖子
入门百科

浅谈PostgreSQL斲丧的内存盘算方法

[复制链接]
甜心猫舍 显示全部楼层 发表于 2021-10-26 13:06:23 |阅读模式 打印 上一主题 下一主题
wal_buffers默认值为-1,此时wal_buffers使用的是shared_buffers,wal_buffers大小为shared_buffers的1/32
autovacuum_work_mem默认值为-1,此时使用maintenance_work_mem的值
1 不使用wal_buffers、autovacuum_work_mem

盘算公式为:
  1. max_connections*work_mem + max_connections*temp_buffers +shared_buffers+(autovacuum_max_workers * maintenance_work_mem)
复制代码
假设PostgreSQL的设置如下:
  1. max_connections = 100
  2. temp_buffers=32MB
  3. work_mem=32MB
  4. shared_buffers=19GB
  5. autovacuum_max_workers = 3
  6. maintenance_work_mem=1GB #默认值64MB
复制代码
  1. select(
  2. (100*(32*1024*1024)::bigint)
  3. + (100*(32*1024*1024)::bigint)
  4. + (19*(1024*1024*1024)::bigint)
  5. + (3 * (1024*1024*1024)::bigint )
  6. )::float8 / 1024 / 1024 / 1024
  7. --output
  8. 28.25
复制代码
此时pg满载峰值时最多使用28.25GB内存,物理内容为32GB时,尚有3.75GB内存给操纵系统使用.
2 使用wal_buffers,不使用autovacuum_work_mem

盘算公式为:
  1. max_connections*work_mem + max_connections*temp_buffers +shared_buffers+wal_buffers+(autovacuum_max_workers * autovacuum_work_mem)
复制代码
假设PostgreSQL的设置如下:
  1. max_connections = 100
  2. temp_buffers=32MB
  3. work_mem=32MB
  4. shared_buffers=19GB
  5. wal_buffers=16MB #--with-wal-segsize的默认值
  6. autovacuum_max_workers = 3
  7. maintenance_work_mem=1GB
复制代码
  1. select(
  2. (100*(32*1024*1024)::bigint)
  3. + (100*(32*1024*1024)::bigint)
  4. + (19*(1024*1024*1024)::bigint)
  5. + (16*1024*1024)::bigint
  6. + (3 * (1024*1024*1024)::bigint )
  7. )::float8 / 1024 / 1024 / 1024
  8. --output
  9. 28.26
复制代码
此时pg满载峰值时最多使用28.5GB内存,物理内容为32GB,尚有3.5GB内存给操纵系统使用.
3 同时使用wal_buffers、autovacuum_work_mem[发起使用]

盘算公式为:
  1. max_connections*work_mem + max_connections*temp_buffers +shared_buffers+wal_buffers+(autovacuum_max_workers * autovacuum_work_mem)+ maintenance_work_mem
复制代码
假设PostgreSQL的设置如下:
  1. max_connections = 100
  2. temp_buffers=32MB
  3. work_mem=32MB
  4. shared_buffers=19GB
  5. wal_buffers=262143kb
  6. autovacuum_max_workers = 3
  7. autovacuum_work_mem=256MB
  8. maintenance_work_mem=2GB
复制代码
  1. select(
  2.   (100*(32*1024*1024)::bigint)
  3.   + (100*(32*1024*1024)::bigint)
  4.   + (19*(1024*1024*1024)::bigint)
  5.   + (262143*1024)::bigint
  6.   + (3 * (256*1024*1024)::bigint )
  7.   + ( 2 * (1024*1024*1024)::bigint )
  8. )::float8 / 1024 / 1024 / 1024
  9. --output
  10. 28.01
复制代码
此时pg载峰值时最多使用28.25GB内存,物理内容为32GB时,尚有3.75GB内存给操纵系统使用.发起全部内存消耗根据硬件设置,也就是使用这个设置.
增补:postgresql 内存使用设置
  1. shared_buffers:
复制代码
这是最紧张的参数,postgresql通过shared_buffers和内核和磁盘打交道,因此应该只管大,让更多的数据缓存在shared_buffers中。通常设置为现实RAM的10%是公道的,比如50000(400M)
  1. work_mem:
复制代码
在pgsql 8.0之前叫做sort_mem。postgresql在实行排序操纵时,会根据work_mem的大小决定是否将一个大的效果集拆分为几个小的和 work_mem查不多大小的临时文件。显然拆分的效果是低沉了排序的速率。因此增长work_mem有助于提高排序的速率。通常设置为现实RAM的2% -4%,根据须要排序效果集的大小而定,比如81920(80M)
  1. effective_cache_size:
复制代码
是postgresql能够使用的最大缓存,这个数字对于独立的pgsql服务器而言应该足够大,比如4G的内存,可以设置为3.5G(437500)
  1. maintenance_work_mem:
复制代码
这里界说的内存只是在CREATE INDEX, VACUUM等时用到,因此用到的频率不高,但是往往这些指令消耗比力多的资源,因此应该尽快让这些指令快速实行完毕:给maintence_work_mem大的内存,比如512M(524288)
  1. max_connections:
复制代码
通常,max_connections的目的是防止max_connections * work_mem超出了现实内存大小。比如,如果将work_mem设置为现实内存的2%大小,则在极度环境下,如果有50个查询都有排序要求,而且都使 用2%的内存,则会导致swap的产生,系统性能就会大大低沉。当然,如果有4G的内存,同时出现50个云云大的查询的几率应该是很小的。不过,要清晰 max_connections和work_mem的关系。
设置 主机: 32GB
  1. shared_buffers = 1024MB
  2. work_mem = 1MB
  3. effective_cache_size = 20480MB
  4. maintenance_work_mem = 1024MB
  5. max_connections = 8000
复制代码
以上为个人履历,盼望能给各人一个参考,也盼望各人多多支持草根技能分享。如有错误或未思量完全的地方,望不吝赐教。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作