将性能统计信息存储在数据库中以便稍后查询的有哪些好方法?

时间:2010-03-23 18:37:07

标签: database-design statistics

目标:在数据库中存储您关心的内容(当前登录的客户数量,正在处理的小部件数量等)的任意性能统计信息,以便您可以了解你的服务器在一段时间内的表现如何。

假设:数据库已经可用,您已经知道如何收集所需信息,并且能够将数据放入数据库中。

解决方案的一些理想属性

  • 导致受监视的服务器没有明显的性能损失
  • 具有非常高的测量精度
  • 不存储无用或冗余信息
  • 易于查询(适合收集/显示有用信息)
  • 适合自己绘图
  • 准确
  • 很优雅

主要问题

1)触发统计数据存储的好设计/方法/方案是什么?

2)如何实际存储数据的数据库设计是什么?

示例答案......有点模糊和蹩脚......

1)我可以按[固定时间间隔]存储一行数据,其中包含我关注的所有性能测量值,这些测量值是在一个由时间戳和/或索引编制索引的大平面表的每一列中服务器

2)我可以有一个守护程序监视我关心的性能,并且每当某些内容发生变化时(而不是以固定的时间间隔)添加一行到#1中的平面表。

3)我可以像在#2中那样触发,但是我可以存储关于我在单独的表中测量的每个性能方面的信息,从而为经常更改的项目增加了大量行的可能性,并且很少用于很少更改项目的行。

  
    

最后,我会实施某事,即使这是我自己构成的一些超级脑死亡的方法,但我敢打赌,有一些非常聪明的人愿意分享他们的经验和聪明的想法!

  

3 个答案:

答案 0 :(得分:1)

为了记录,我对KM有所了解,很难就给出的信息提供具体的答案;而且通常情况如此 - 在这种情况下,你可能会从思考事物而不是结果中获得更多价值。

对于数据的存储 - 将针对旨在报告的数据库进行最佳报告 - OLAP类型架构。

如何获取数据会有不同的问题 - 我们谈论了多少数据以及您希望如何移动数据?我问的原因是,如果你要以同步的方式插入它,你会希望它很快 - 一个OLTP样式的数据库架构。

严格来说,如果你处于前沿性能之后,你可能需要为每个部分分别设置一个数据库(捕获数据/报告它)。

在你开始之前 - 如果你想要优雅 - 你需要仔细考虑你想要引入的数据的逻辑数据模型。优先级列表中的高位应该是核心{ {3}}:时间,原点(组件等),等等。这是基于BI /数据的项目最重要的事情之一 - 您想要回答哪些问题?

这也是你开始想要捕捉什么的地方。确保您对该数据有良好的定义(来自何处,含义等)。通过“它来自何处”,我不仅指代方法/类/组件/系统,还指实际产生您正在记录的值及其含义的内容;这对于登录的用户数量这一点尤为重要,这个数字的确切含义是什么?如果它是一个Web应用程序,如果您记录每个请求,您将能够报告所需的“登录”用户数量:平均值,按时间,峰值并发等等。

最后一点 - 取决于您正在做什么(以及如何)由于捕获太多数据而导致的性能损失风险很低;拥有它而不需要它通常更好 - 而不是需要它而不是它。仅仅因为你拥有它并不意味着你必须报告它。

准确性:使用现有的良好使用的行业组件来捕获/记录数据 MS Ent Libs非常适合这种情况,他们拥有庞大的用户群 - 因此他们的质量很高。它们包含一个Trace语句,用于将执行时间记录到精细级别。 它们也是高度可配置的 - 这有助于实现优雅的解决方案。

答案 1 :(得分:0)

我认为Does not store useless or redundant informationIs easy to query (lends itself to gathering/displaying useful information)是互斥的。如果您非常有效地存储数据,例如在示例#2中,则需要复杂的查询来重新创建范围或时间点内发生的事情,因为您只存储更改。

您确实没有提供详细信息,因此难以提供具体建议。例如,在您的示例#1中,您会考虑每分钟多少个间隔?这可能会影响您的Causes no noticeable performance hit on the server being monitored可能不会,取决于每小时1次或每分钟30次。

您不提供有关您正在收集的统计数据的信息,因此无法进行表格设计。

无论您做什么,都要将统计信息发送到不同服务器上的数据库。这将使您对生产数据库的性能影响最小。

答案 2 :(得分:0)

在开始之前,请记住使用通用监控工具。 Zabbix或Munin可以告诉您一般资源瓶颈在哪里(例如内存,CPU,I / O),像PgBadger这样的特定于数据库的日志分析工具可以告诉您哪些查询很慢等等。

我将通过可用的技术和时间间接回答:

1)如果您有许多不同的指标要尽快开始记录,以后可能会担心检索数据(例如,您不确切地知道要测量的是什么,所以您只是想要要转储所有可能的东西,你可以使用像MongoDB或Redis这样的NoSQL数据库。

稍后,您可以播放数据。检索效率不高。

2)如果你喜欢敏捷方法,那就从小做起。选择任何后端(SQL,文本文件),并仅转储一些数据,然后根据第一次调查显示的内容将其扩展为更多列。表格设计仅取决于您的应用。对于MVC Web应用程序,它可以是controller / action / user_id / total_pageload_time / memory_used。然后你可以简单地按控制器分组,看看哪些部分很慢。根据我的经验,SQLite适用于这样的只写数据。

3)如果你需要微优化,你应该为你的服务器软件寻找官方的非官方插件或外部工具(例如PgBadger for PostgreSQL等)。

无论如何,考虑到你的“理想属性”,我首先会使用带有小表的某种SQL服务器,逐步添加跟踪参数,而不是试图想出一个完美永久持久的表设计。