我有一个使用Postgresql数据库的Ruby on Rails应用程序。我注意到我的数据库性能每5-7分钟都有很大的峰值。
我看到简单查询的响应次数超过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内存。
我做了以下对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
答案 0 :(得分:1)
检查点结束时出现严重的IO问题。请注意,慢查询主要是COMMIT,除了刷新WAL日志之外几乎什么都不做,并且需要41.604秒才能同步文件(包括11秒同步一个文件!)。
你可以在PostgreSQL中做些什么来改善这一点。我听说有关降低shared_buffers的传言可能有所帮助,但我还没有看到第一手资料。
您可能需要对操作系统进行更改,例如降低/proc/sys/vm/dirty_ratio
,以便它不会在检查点之间建立如此多的脏数据。此外,如果您可以将WAL日志与主数据分开,则可以提供帮助。
您使用的文件系统是什么?什么内核/发行版?
您的工作负载可能无法被您正在使用的IO系统所适应,您需要转向功能更强大的硬件。