pan*_*a82 6 postgresql performance database-tuning postgresql-9.4 performance-tuning
我的 PostgreSQL 9.4.1 服务器出现性能问题。我已经使用通常的最佳实践(pgtune + google)调整了服务器。这是相关的配置:
# <snip> the default config above
default_statistics_target = 50
maintenance_work_mem = 960MB
constraint_exclusion = on
checkpoint_completion_target = 0.9
effective_cache_size = 11GB
work_mem = 96MB
wal_buffers = 8MB
checkpoint_segments = 16
shared_buffers = 4GB
max_connections = 200
autovacuum = on
log_autovacuum_min_duration = 10000
autovacuum_max_workers = 5
autovacuum_naptime = 1min
autovacuum_vacuum_threshold = 50
autovacuum_analyze_threshold = 25
autovacuum_vacuum_scale_factor = 0.2
autovacuum_analyze_scale_factor = 0.1
#autovacuum_freeze_max_age = 200000000
autovacuum_vacuum_cost_delay = 20ms
autovacuum_vacuum_cost_limit = -1
#log_statement='mod'
#log_statement='all'
logging_collector = on
Run Code Online (Sandbox Code Playgroud)
然而,在高负载时查询性能非常差。同时,服务器上的总 RAM 使用量为 4GB(可用空间为 16GB)。
我不禁认为这两个问题是相关的。如果 pg 只使用更多的可用 RAM,那么性能将会提高。
服务器是 Intel(R) Xeon(R) CPU E3-1240 v3 @ 3.40GHz,16GB RAM。我们有 2 个磁盘 (WDC WD1003FBYZ-0) 但没有 RAID。有性能问题的数据库使用表空间在这些磁盘之间进行分割。操作系统是 Debian 7.5。
那么,我错过了什么明显的东西吗?我是不是叫错了树?或者这里真的有什么可疑的东西?
Cra*_*ger 11
PostgreSQL 依靠操作系统的磁盘缓存来进行大多数缓存。大多数工具通常将此缓存报告为“空闲”RAM,因为现代操作系统将当前空闲的RAM 中的所有部分用作磁盘缓存。
这是正常的。
为了确认,使用一个更好的工具来显示缓冲区/缓存与真正空闲的内存分开。在 Linux 上,free -m
将显示更多信息。
另请注意,对于大多数系统,共享内存的计算意味着为 PostgreSQL 进程报告的内存使用情况非常虚假。他们倾向于计算一个进程使用的所有共享内存,从而多次计算每个共享内存页。或者他们倾向于完全忽略共享内存,根本不计算它。估计 PostgreSQL 实际内存使用量的最佳方法是获取每个进程的非共享内存使用量,将它们相加,然后将shared_buffers
大小添加到总数中。
BTW,shared_buffers
是二级缓存。那里的任何干净缓冲区可能会复制操作系统磁盘缓存中的内容。所以有一个最佳的系统和工作负载特定大小。太小了,您会开始努力寻找要读入的空闲页面,或者过早地将脏缓冲区输出以进行有效的写入组合。太大并且您从操作系统磁盘缓存中双重缓存了太多干净的页面。
归档时间: |
|
查看次数: |
5521 次 |
最近记录: |