通过DBMS“插件”或其他解决scheme进行性能分析

我正在研究一个系统监控产品,目前主要关注系统级的性能。 我们正在扩展到监视数据库系统。 现在我们可以从select的DBMS中获取简单的性能信息,如连接数,磁盘IO率,锁等待时间等。

但是,我们真的很喜欢测量进入DBMS的每个查询的执行时间, 而不需要客户端在其应用程序代码中实现监视。

一些潜在的解决scheme可能是

  • 某种代理位于客户端和服务器之间。 SSL可能是一个问题,另外它需要我们对每个DBMS进行反向工程和实现networking协议。
  • 每个DBMS系统的插件,当查询进入时自动logging性能信息。

其他问题包括“匿名化”的SQL,即采取像SELECT * FROM products WHERE price > 20 AND name LIKE "%disk%"并产生SELECT * FROM products WHERE price > ? AND name LIKE "%?%" SELECT * FROM products WHERE price > ? AND name LIKE "%?%" ,虽然这不应该太困难,一些聪明的parsing和正则expression式。

我们主要关注于:

  • MySQL的
  • MSSQL
  • 神谕
  • Redis的
  • MongoDB的
  • memcached的

有没有任何插件式的机制,我们可以利用这些? 还是有一个更简单的解决scheme?

没有适用于所有数据库的通用解决scheme。 而试图在Oracle上测量查询响应时间非常困难。 我没有在memcache / nosql dbs上进行性能分析。

对于mysql,有mysqlproxy – 可以很容易地编写脚本。 但是,您可能会从慢查询日志中获得所需的一切(阈值为零)。 我使用此脚本的修改版本来“匿名”我的查询。

Compuware的客户端有很多(非常昂贵的)工具,它们可以嗅探networkingstream量并推断各层(包括数据库)的性能指标。 我所知道的唯一可比较的免费软件工具是PastMon (AFAIK),它不提供在持久TCP连接上测量数据库响应时间所需的深度检查。

虽然可以通过networking服务获取所有访问来捕获所有的度量标准,但这会在事务中引入延迟。 对于任何代理types的操作都是如此 – 但是对于通过SSL的非持久连接会特别痛苦。

您是否考虑过如何收集/维护/分析所有这些数据? 你可能想看看石墨 。

你使用什么types的客户端? 在开始查看数据库之前,您应该测量客户端的响应关系 – 如果您遇到性能问题,则只需要担心数据库性能。 而客户端是一个网页浏览器,那么这是一个更简单的任务。 只需设置您的Web服务器以logging响应时间并开始混搭数据。 你甚至可以添加simlpe插件来测量页面响应 – 这是一个更好的感知性能指标 – 例如雅虎的Boomerang