您如何进行数据库的负载测试和容量规划?


34

这是关于数据库容量规划的规范问题

有关:

我正在寻找一个有关数据库容量规划的工具和方法的规范问题。这是一个典型的问题。

显然,一般的工作流程是:

  • 放好方案
  • 添加监控
  • 增加流量
  • 评估结果
  • 根据结果​​进行补救
  • 漂洗,重复直到相当开心

请随意描述用于不同Web服务器,框架等的不同工具和技术以及最佳实践。


数据库几乎永远不会是一个独立的系统。在大型应用服务器的主要环境中可以看到它。数据库是后端数据设备。因此,在测试负载时,您必须考虑到这一点。
尼尔斯,

Answers:


24

磁盘和RAM容量规划

规划数据库服务器的磁盘和内存容量是一门妖术。多多益善。越快越好。

作为一般准则,我提供以下内容:

  • 你想比你更多的磁盘空间EVER需要。
    对未来3-5年所需的磁盘空间进行最佳估算,然后再增加一倍。
  • 您将需要足够的RAM来将数据库索引保存在内存中,处理最大的查询至少两次以上,并且仍然留有足够的空间以保持良好的OS磁盘缓存。
    索引大小将取决于您的数据库,其他所有内容都将严重取决于您的数据集和查询/数据库结构。我将提出“至少是最大表大小的2倍”的建议,但请注意,此建议在大型表可能为数十或数百GB的大型数据仓库操作中被打破。

每个数据库供应商都有一些有关调整磁盘/内存/ OS内核的性能的说明-在部署之前花一些时间阅读本文档。我会帮你的。


工作量基准和容量规划

假设您尚未部署…

许多数据库系统附带基准测试工具-例如,PostgreSQL附带pgBench
这些工具应该是基准测试数据库性能的第一站。如果可能,您应该在所有新的数据库服务器上运行它们,以了解数据库服务器可以完成的工作量。

现在可以使用原始基准测试,该基准测试是ABSOLUTELY MEANINGLESS让我们考虑一种更实际的基准测试方法:加载数据库架构并编写一个程序,该程序使用虚拟数据填充该模型,然后针对该数据运行应用程序的查询。
这对三个重要的方面进行了基准测试:1.数据库服务器(硬件)2.数据库服务器(软件)3.您的数据库设计及其与上述(1)和(2)的交互方式。

请注意,这比简单的预先建立的基准测试pgBench需要付出更多的努力,例如:您需要编写一些代码来进行填充,并且可能需要编写一些代码来进行查询和报告执行时间。
这种测试也实际上更加准确:由于您正在使用架构和查询,因此您可以查看它们的性能,并为您提供剖析和改进数据库/查询的机会。

这些基准测试的结果是数据库的理想视图。为安全起见,假设您在生产环境中只能获得此性能的50-70%(其余的信息可以缓冲您的意外增长,硬件故障,工作负载变化等)。


太晚了!在生产中!

一旦系统投入生产,“基准测试”就来不及了–您可以短暂地打开查询日志记录/计时,并查看执行所需的时间,并且可以在停机期间针对大型数据集运行一些“压力测试”查询小时。您还可以查看系统的CPU,RAM和I / O(磁盘带宽)利用率,以了解系统的负载量。
不幸的是,所有这些事情都会使您对系统的工作情况有个大概的了解,并且对系统的饱和程度有一个模糊的概念。
那把我们带到…


持续监控

如果您的系统突然发现新的/不同的使用模式,那么世界上所有的基准测试都将无法为您提供帮助。
无论是好是坏,数据库部署都不是一成不变的:您的开发人员将改变事情,数据集将增长(它们似乎从未收缩),并且用户将以某种方式创建在测试中从未预料到的疯狂事件组合。

为了对数据库进行适当的容量规划,您将需要实施某种性能监视,以在数据库性能不再符合您的期望时向您发出警报。此时,您可以考虑采取补救措施(新硬件,数据库架构或查询更改以优化资源使用等)。


注意:这是一个非常高级的通用指南,用于确定数据库硬件的大小并弄清楚它可能遭受多少滥用。如果您仍然不确定如何确定特定系统是否满足您的需求,则应咨询数据库专家。
还有一个专门用于数据库管理的Stack Exchange网站:dba.stackexchange.com。搜索他们的问题档案或浏览特定于您的数据库引擎的标签,以获取有关性能调整的更多建议。


1
除此之外,如今,您可以使用SSD进行交换/磁盘操作。这样可以加快使用磁盘上大型临时表的查询的速度。因此,添加更多的SSD通常是一个好主意。
彼得

2
@Peter我不建议将SSD用作交换空间(如果您正在积极进行交换,则客户流失率非常高),尽管具有足够大的SSD和良好的磨损平衡能力,磁盘可能会延长机器的使用寿命。我已经看到用于临时表空间的SSD具有良好的效果。
voretaq12年

1
请注意,有关SSD的注释中的此建议已使用7年。在2019年或更晚版本中,在数据库服务器上保存数据库的每个存储都应为SSD。
马克·亨德森

1

通常,您需要实际的用例来测试性能。最佳实践是让应用程序开发人员和最终用户参与。

记录他们通常在做什么,并针对每个用例对其进行参数化(内容,并发操作数)。

然后建立客户端。单个物理机器通常不足以建立生产负载。

然后将其启动,计算,增强并再次测试。

bottlnecks上升的地方您会感到惊讶。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.