【问题标题】:FIWARE Orion/MongoDB Performance on AWSAWS 上的 FIWARE Orion/MongoDB 性能
【发布时间】:2015-12-03 17:42:07
【问题描述】:

我似乎在试图获得接近文档中所述性能的任何地方时遇到了真正的问题(约 700 - 2000 tps,VM 为:2 个 vCPU 4GB RAM)。我已经在本地虚拟机、本地机器和一些 AWS 虚拟机上进行了尝试,但我无法接近。 - 我在 AWS VM 上达到的最大值是 80 tps。

我尝试更改 orion 的 -dbPoolSize 和 -reqPoolSize 并使用 ulimit 将其设置为 MongoDB 建议的值 - 但我所做的所有更改似乎都没有让我接近。

我已经按照文档中的建议在 _id.id、_id.type 和 _id.servicePath 上设置了索引 - 后者让我从 40 tps 增加到 80 tps。

我应该将 Orion 或 Mongo 的任何配置选项设置为远离默认设置,这会让我更接近吗?还有其他性能提示吗?文档中指向测试脚本的链接无效,因此我无法查看示例。

我已经使用 Node.js 创建了自己的测试脚本,并且我已经使用可变数量的并发连接和 1 到 2 个负载注入器测试了更新和查询。

从“顶部”的输出来看,负载来自 Mongo,因为它几乎耗尽了 CPU,但向 VM 添加更多内核并不会改变统计数据。虚拟机有 7.5GB 或 15GB 的 RAM,所以 mongo 应该能够将所有数据放入内存中以获得极快的性能?

我已经使用 mongostat 看到从 orion 到 mongo 的连接随着 -dbPoolSize 选项的变化而变化,但这并没有产生更好的性能。

您能提供的任何帮助将不胜感激。

我曾尝试将 CentOS 6.5 和 6.7 与 Orion 0.25 和 0.26 以及 MongoDB 2.6 与约 500,000 个实体一起使用

我的测试脚本和数据是on GitHub

到目前为止,我只在没有订阅的情况下进行了测试,但我已经准备好使用订阅进行测试的脚本 - 但我想在添加订阅之前获得一个好的基线。

我的数据是围绕英国国家/地区的停车位及其区域及其外代码(邮政编码的第一部分)建模的。这是使用 servicePaths 将它们拆分为 outcode 中的停车场。

这是gist with the requests and mongo shell output

【问题讨论】:

  • 您能否编辑帖子以添加一些有关用于强调 CB 的操作类型的详细信息,好吗?您正在使用的更新和查询操作的“模板”就可以了。
  • 此外,您能否编辑帖子以澄清实体集的一部分,您是否有订阅?
  • 您好 fgalan,我已更新问题并添加了指向我的测试脚本和数据的链接。
  • 如果您可以提供代码发送到 Orion 的“裸请求”,那就太好了,即请求行(动词 + URL)+ HTTP 标头 + 有效负载(如果适用)。如果不仔细查看,从代码本身推断此类信息将很难(此外,我不是 JavaScript 专家)。我的意思是这样的:gist.github.com/fgalan/ff035ae09d98b0842771
  • 此外,假设您的实体具有规则形状(即所有实体都具有相同的属性),如果您可以在问题中添加“模型实体”,例如db.entities.findOne() 在 mongo shell 的输出。

标签: mongodb amazon-web-services amazon-ec2 fiware fiware-orion


【解决方案1】:

性能是一个复杂的话题,取决于许多因素(Orion 和 MongoDB 的部署设置、Orion 和 MongoDB 的启动配置、托管进程的系统中的硬件配置文件、网络通信、虚拟化情况下的过度配置级别、注入负载等)所以没有任何通用的答案来处理这类问题。不过,我会尝试提供一些提示和建议,希望对您有所帮助。

关于版本,建议使用 Orion 0.26.0(或 0.26.1)而不是 0.25.0。我们在 Orion 0.26.0 中包含了与性能相关的 lot of improvements。关于MongoDB,我们也发现了3.0 could be much better than 2.6,特别是在更新密集的场景中。

话虽如此,首先你应该找到瓶颈。执行此操作的有用工具是 topmongostatmongotop。它可以是 Orion、MongoDB 或连接它们的网络。如果瓶颈是 CB,则可能是this document may help 中提供的性能调整提示。 MongoDB 中的慢查询信息也可能指向 Orion 的瓶颈。如果瓶颈是 MongoDB,考虑到您拥有的大量实体(500,000)也许您应该考虑实现sharding。如果瓶颈是网络,托管 Orion 和 MongoDB 可能会有所帮助。

最后,您还可以尝试一些方法来更深入地了解问题:

  • 在 AWS 之外运行一些测试(即本地虚拟机)以进行比较。我对 AWS 中的过度配置政策了解不多,但根据我之前与其他云提供商的经验,VM 过度配置(特别是如果它随时间变化)可能会影响性能。
  • 分析性能是否与实体数量有关。例如。使用 500、5,000、50,000 和 500,000 个实体运行测试,并获得每种情况下的性能数据。
  • 分析性能是否与 servicePath 的使用有关,例如将所有 500,000 个实体放在默认服务路径 / 中(将 servicePath 的当前内容移动到另一个位置,例如实体属性或实体 ID 字符串的一部分)并测试。目前 Orion 使用正则表达式来过滤 servicePath,这可能会很慢。

【讨论】:

  • 关于最后一个项目符号,我对结果特别感兴趣,如果确认有问题,则应该更改 servicePath 的 Orion 查询策略。请@graham-v,继续发布您的进度!
  • 在 Orion 中启用了一些统计信息,this JSON 告诉我等待内部“mongoBackend”模块花费了 10 秒 - 即 mongo 不是瓶颈?
  • 我还测试了本地机器和虚拟机之间的网络(使用我当前的脚本),我可以轻松地从一个简单的 HTTP 服务器获得 ~3000 rps。所以我认为我可以排除网络和我的脚本,因为它们可以注入足够的负载并且网络可以处理它。
  • 这可能是由于数据库查询速度慢。为了继续对此进行研究,下一步将隔离在 DB 上运行的查询(使用-logLevel INFO 运行 CB 将在Database Operation Successful 之后在 REST API 上发送请求)。此外,我可能需要转储orion 数据库。是否有可能拥有它(不确定此类数据的机密性/敏感性)?如果您愿意,我们可以依靠私人渠道通过转储。
  • 最后我更新到 0.26.1 并使用了“-reqMutexPolicy none -dbPoolSize 100”,这使得 mongodb 而不是 Orion 成为瓶颈。所以我认为这是一个很好的进步。但是,mongo 似乎确实非常努力地完成查询:在 c3.8xlarge 机器(32 核,60GB RAM)上,我只设法获得 ~250 tps,而我预计这种机器会达到 1000 个硬件?很高兴看到现在最高的 CPU 使用率已经最大化了所有核心,以前它会达到 ~100% 现在它达到(核心数)* 100% - 在 16 核机器上我看到 1600% 利用率
猜你喜欢
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多