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

gWa*_*ldo 36 database load-testing capacity-planning benchmark

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

有关的:

我希望创建一个关于数据库容量规划工具和方法的规范问题。这是一个规范的问题。

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

  • 放置您的场景
  • 添加监控
  • 添加流量
  • 评估结果
  • 根据结果​​进行补救
  • 冲洗,重复直到合理快乐

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

vor*_*aq7 24

磁盘和 RAM 容量规划

为数据库服务器规划磁盘和内存容量是一门黑色艺术。更多更好。越快越好。

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

  • 您需要比您永远需要的更多磁盘空间。
    对未来 3-5 年需要多少磁盘空间进行最佳估计,然后将其翻倍。
  • 您需要足够的 RAM 来将数据库索引保存在内存中,至少处理两次最大的查询,并且仍然有足够的空间用于健康的操作系统磁盘缓存。
    索引大小将取决于您的数据库,而其他一切在很大程度上取决于您的数据集和查询/数据库结构。我将提供“至少是最大表大小的 2 倍”作为建议,但请注意,此建议分解了真正大的数据仓库操作,其中最大的表可以是数十或数百 GB。

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


工作负载基准测试和容量规划

假设你还没有部署……

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

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

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

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


太晚了!它正在生产中!

一旦您的系统投入生产,“基准测试”真的为时已晚——您可以简单地打开查询日志记录/计时并查看执行所需的时间,并且您可以在关闭期间针对大型数据集运行一些“压力测试”查询小时。您还可以查看系统的 CPU、RAM 和 I/O(磁盘带宽)利用率,以了解它的负载情况。
不幸的是,所有这些事情都会让您了解系统正在做什么,以及它接近饱和的程度的模糊概念。
这让我们……


持续监控

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

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


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

  • @Peter 我不建议将 SSD 用于交换空间(如果您正在积极交换,则流失率非常高),尽管具有足够大的 SSD 和良好的磨损均衡磁盘可能会持续机器的使用寿命。我已经看到用于临时表空间的 SSD 效果很好。 (2认同)