我们正在运行 Postgres 9.1.3,我们最近开始在我们的一台服务器上遇到主要的性能问题。
我们的查询在一段时间内运行良好,但截至 8 月 1 日,它们的速度急剧下降。看起来大多数有问题的查询都是 Select 查询(带有 count(*) 的查询特别糟糕),但总的来说,数据库运行得很慢。
我们在服务器上运行了这个查询,这些是我们对默认配置文件所做的更改(注意:服务器在这些更改之前运行良好,因此它们可能并不重要):
name | current_setting
---------------------------+---------------------------------------------------------------------------------------------------------------
version | PostgreSQL 9.1.2 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
autovacuum | off
bgwriter_delay | 20ms
checkpoint_segments | 6
checkpoint_warning | 0
client_encoding | UTF8
default_statistics_target | 1000
effective_cache_size | 4778MB
effective_io_concurrency | 2
fsync | off
full_page_writes | off
lc_collate | en_US.UTF-8
lc_ctype | en_US.UTF-8
listen_addresses | *
maintenance_work_mem | 1GB
max_connections | 100
max_stack_depth | 2MB
port | 5432
random_page_cost | 2
server_encoding | UTF8
shared_buffers | 1792MB
synchronous_commit | off
temp_buffers | 16MB
TimeZone | US/Eastern
wal_buffers | 16MB
wal_level | minimal
wal_writer_delay | 10ms
work_mem | 16MB
(28 rows)
Time: 210.231 ms
通常,当出现此类问题时,人们建议的第一件事是吸尘,我们已经尝试过了。我们对大部分数据库进行了真空分析,但没有帮助。
我们Explain
在一些查询中使用并注意到 Postgres 使用顺序扫描,即使表有索引。
我们关闭了顺序扫描以强制查询计划器使用索引,但这也无济于事。
然后我们尝试了这个查询,看看我们是否有很多未使用的磁盘空间,Postgres 正在通过这些空间来找到它正在寻找的东西。不幸的是,虽然我们的一些表确实有点大,但它似乎不足以降低整体系统性能。
我们认为减速可能与 I/O 有关,但我们无法弄清楚具体情况。Postgres 只是愚蠢吗?如果是,那是什么?虚拟机有问题,还是物理硬件本身有问题?
对于我们可以尝试或检查的事情,你们还有其他建议吗?
编辑:
我很抱歉没有早点更新这个。我被其他事情缠住了。
在这台特定的机器上,通过对虚拟机的设置进行小的修改,我们的性能得到了极大的提高。
有一个处理 IO 缓存的设置。它最初设置为 ON。我们认为不断缓存内容会减慢速度,我们是对的。我们把它关掉了,事情有了很大的改善。
有趣的是,我们大多数其他服务器已经关闭了此设置。
还有其他问题,我相信我们会采纳您的很多建议,所以,非常感谢您的帮助。