简单的postgresql插入/更新查询,每隔5-7分钟响应*秒*

时间:2014-03-03 16:20:45

标签: sql ruby-on-rails postgresql

我有一个使用Postgresql数据库的Ruby on Rails应用程序。我注意到我的数据库性能每5-7分钟都有很大的峰值。

newrelic request response time - database spikes

我看到简单查询的响应次数超过1次,如:

UPDATE users SET last_seen_at = ? where id = ?

INSERT INTO emails (email, created_at, updated_at) VALUES (?, ?, ?)

VPS是AWS EC2实例(m2.2xlarge),具有4核Xeon 2.4ghz和34gb内存。

Here is my postgresql.conf

我做了以下对conf的更改以试图弄明白(比如减少检查点超时的数量)无济于事。

root:/etc/postgresql/9.2/main# diff postgresql.conf.bck postgresql.conf
176,178c176,178
< #checkpoint_segments = 3    # in logfile segments, min 1, 16MB each
< #checkpoint_timeout = 5min    # range 30s-1h
< #checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0
---
> checkpoint_segments = 10    # in logfile segments, min 1, 16MB each
> checkpoint_timeout = 30min    # range 30s-1h
> checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0
361c361
< #log_min_duration_statement = -1  # -1 is disabled, 0 logs all statements
---
> log_min_duration_statement = 2s  # -1 is disabled, 0 logs all statements
370,371c370,371
< #debug_print_rewritten = off
< #debug_print_plan = off
---
> #debug_print_rewritten = on
> #debug_print_plan = on
376c376
< #log_duration = off
---
> #log_duration = on
378c378
< #log_hostname = off
---
> #log_hostname = on
399c399
< #log_lock_waits = off     # log lock waits >= deadlock_timeout
---
> log_lock_waits = on     # log lock waits >= deadlock_timeout

1 个答案:

答案 0 :(得分:1)

检查点结束时出现严重的IO问题。请注意,慢查询主要是COMMIT,除了刷新WAL日志之外几乎什么都不做,并且需要41.604秒才能同步文件(包括11秒同步一个文件!)。

你可以在PostgreSQL中做些什么来改善这一点。我听说有关降低shared_buffers的传言可能有所帮助,但我还没有看到第一手资料。

您可能需要对操作系统进行更改,例如降低/proc/sys/vm/dirty_ratio,以便它不会在检查点之间建立如此多的脏数据。此外,如果您可以将WAL日志与主数据分开,则可以提供帮助。

您使用的文件系统是什么?什么内核/发行版?

您的工作负载可能无法被您正在使用的IO系统所适应,您需要转向功能更强大的硬件。