【发布时间】:2010-09-07 09:56:33
【问题描述】:
我正在设置一个带有 FreeBSD PostgreSQL 后端的 Web 应用程序。我正在寻找一些数据库性能优化工具/技术。
【问题讨论】:
标签: sql database optimization postgresql freebsd
我正在设置一个带有 FreeBSD PostgreSQL 后端的 Web 应用程序。我正在寻找一些数据库性能优化工具/技术。
【问题讨论】:
标签: sql database optimization postgresql freebsd
数据库优化通常是两件事的结合
减少查询量通常是通过在应用程序内部(如果可能)或在一个更高效的外部数据存储(memcached、redis 等)。如果您有大量写入的信息(例如命中计数器)并且不需要 ACID-semantics,您还可以考虑将其从 Postgres 数据库中移出到更高效的数据存储中。
优化查询运行时更加棘手 - 这可能相当于创建 special indexes(或 indexes in the first place)、更改(可能是非规范化)数据模型或更改应用程序在使用数据库时采用的基本方法.例如,请参阅 Markus Winand 的 Pagination done the Postgres way 谈话,了解如何重新思考分页的概念以提高数据库效率
但要了解应首先查看哪些查询,您需要了解它们的执行频率以及它们平均运行多长时间。
一种方法是记录所有(或“慢”)查询,包括它们的运行时间,然后解析查询日志。一个很好的工具是pgfouine,在前面的讨论中已经提到过,它已经被pgbadger 取代,pgbadger 是用更友好的语言编写的,速度更快,维护也更积极。
pgfouine 和 pgbadger 都需要启用查询日志记录,这可能会导致数据库性能受到明显影响,或者在解析日志时遇到磁盘空间问题该工具可能需要相当长的时间,并且不会为您提供有关数据库中正在发生的事情的最新见解。
为了解决这些缺点,现在有两个扩展可以直接在数据库中跟踪查询性能 - pg_stat_statements(仅在版本 9.2 或更高版本中有用)和 pg_stat_plans。两个扩展都提供相同的基本功能 - 跟踪给定的“规范化查询”(查询字符串减去所有表达式文字)的运行频率以及总共花费了多长时间。由于这是在查询实际运行时完成的,因此以非常有效的方式完成,在综合基准测试中可测量的开销不到 5%。
从信息的角度来看,查询列表本身非常“枯燥”。第三个扩展正在努力解决这个问题,并提供更好的数据表示,称为pg_statsinfo(以及pg_stats_reporter),但要启动和运行它是一项艰巨的任务。
为了为这个问题提供更方便的解决方案,我开始着手一个商业项目,该项目专注于 pg_stat_statements 和 pg_stat_plans,并增强了从数据库中提取的大量其他数据收集的信息。它叫做pganalyze,你可以在https://pganalyze.com/找到它。
为了简要概述 Postgres 监控领域中有趣的工具和项目,我还开始在 Postgres Wiki 上编制一份定期更新的列表。
【讨论】:
pgfouine 对我来说效果很好。看起来有一个FreeBSD port。
【讨论】:
我用过一点 pgtop。这很粗略,但至少我可以看到每个进程 ID 正在运行哪个查询。
我试过 pgfouine,但如果我记得,它是一个离线工具。
我还跟踪 psql.log 文件并将日志记录标准设置为可以看到问题查询的级别。
#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements
# and their durations, > 0 logs only
# statements running at least this time.
我还使用 EMS Postgres Manager 来做一般的管理工作。它不会为您做任何事情,但它确实使大多数任务更容易,并使查看和设置您的模式更简单。我发现在使用 GUI 时,我更容易发现不一致(如缺少索引、字段标准等)。它只是我愿意在我的 Mac 上使用 VMWare 的两个程序之一。
【讨论】:
Munin 非常简单而有效,可以了解数据库如何随着时间的推移而发展和执行的趋势。在 Munin 的标准套件中,您可以监控数据库的大小、锁的数量、连接的数量、顺序扫描、事务日志的大小和长时间运行的查询。
易于设置和开始使用,如果需要,您可以非常轻松地编写自己的插件。
在此处查看 Munin 随附的最新 postgresql 插件:
http://munin-monitoring.org/browser/branches/1.4-stable/plugins/node.d/
【讨论】:
首先要做的是使用“解释”尝试所有来自 psql 的查询,看看是否有顺序扫描可以通过添加索引或重写查询转换为索引扫描。
除此之外,我和你一样对这个问题的答案感兴趣。
【讨论】:
查看 Lightning Admin,它有一个用于捕获日志语句的 GUI,虽然不完美,但可以很好地满足大多数需求。 http://www.amsoftwaredesign.com
【讨论】:
DBTuna http://www.dbtuna.com/postgresql_monitor.php 最近开始支持 PostgreSQL 监控。我们将它广泛用于 MySQL 监控,所以如果它为 Postgres 提供相同的功能,那么它也应该适合您。
【讨论】: