【问题标题】:Neo4j: Cypher Performance testing/BenchmarkingNeo4j:Cypher 性能测试/基准测试
【发布时间】:2017-05-29 02:15:03
【问题描述】:

我创建了一个 Neo4j 3 数据库,其中包含一些测试数据以及一个将 http 密码请求发送到 Neo4j 的小型应用程序。这些请求总是在同一时间。 Acutally 它是一个查询模板,只是在某些属性上有所不同。我对这些陈述的表现感兴趣。 我知道我可以使用PROFILE 在浏览器中获取一些信息。但我想执行一组语句,例如。 G。 10 个示例查询,多次计算平均性能。有没有简单的方法或工具可以做到这一点,还是我必须写 e. G。收集这些值的 Python 脚本?它不一定是一个大的应用程序,我只是想看看一些通用的性能指标。

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我认为目前还没有用于对 Neo4j 进行基准测试的开箱即用工具。因此,您最好的选择是实施您自己的解决方案 - 但如果您想获得(在某种程度上)具有代表性的结果,则必须小心:

    1. 检查docs on performance

    2. 给 Neo4j JVM 足够的预热时间。这意味着您需要对查询运行预热阶段并丢弃它们的执行时间。

    3. 除了使用客户端-服务器架构,您还可以选择在嵌入式模式下使用 Neo4j,这将使您更好地了解查询性能(没有驱动程序和序列化/反序列化过程的开销)。但是,在这种情况下,您必须在 JVM 上实现基准测试(在 Java 中或可能在 Jython 中)。

    4. 多次运行每个查询。 不要使用平均值,因为它对异常值更敏感(由于多种原因,您可以获得较高的值,例如,如果操作系统调度程序在特定查询执行期间在后台启动某些作业)。

      该主题的一篇好论文 How not to lie with statistics: the correct way to summarize benchmark results 认为您应该使用几何平均值。

      在计算机科学论文的性能实验中,使用中值也是常见的做法。我倾向于使用此选项 - 例如该图显示了内存 RDF 引擎(Jena 和 Sesame)上两个简单 SPARQL 查询的执行时间,它们的第一次执行和 5 次连续执行的中值。

    5. 1234563在查询执行之间更新。
    6. 作为一个很好的近似值,您可以设计基准以尽可能接近您的实际工作负载 - 在许多情况下,application-specific macrobenchmarks make more sense than microbenchmarks。因此,如果每个查询只会被应用程序评估一次,那么只对第一次评估进行基准测试是完全可以接受的。

    7. (奖励。)该主题的另一个好读物是The Benchmark Handbook - 第 1 章讨论了特定领域基准测试的最重要标准(相关性、可移植性、可伸缩性和简单性)。这些可能不是您的基准测试所必需的,但现在这些都很好。

    我参与了一项跨技术基准测试,其中考虑了关系、图形和语义数据库,包括 Neo4j。您可能会在存储库中找到一些有用的想法或代码 sn-ps:https://github.com/FTSRG/trainbenchmark

    【讨论】:

    • 非常感谢您的意见。这很有帮助。我想要我的配置的 Neo4j 性能。那么使用相同的环境呢,我。 e.通过螺栓驱动程序等访问,循环超过 10 或 20 个不同的查询并写出时间戳。我知道这有点基本,但我想知道一些可以显示近似值的一般值。 Neo4j 的时间消耗和我的应用程序中的处理。然后我可以计算每个语句 Neo4j 的执行时间,然后我可以使用中位数等。
    • @Stefan 我认为你的概念基本上没问题,但我怀疑 Neo4j 仍然可能会缓存结果,所以我建议绘制数据(使用 Excel 工作表或 Python/R 脚本) - 这将显示如果有任何可疑的数据记录。
    • 嗯,好的。有没有办法避免缓存?我没有那么多数据,所以实际上整个图表都可以放入 RAM。但是查询非常复杂,因此我想看看执行需要多少时间...
    • 一个快速而简单的解决方案是实现一个 Java 应用程序并使用 Neo4j 的ImpermanentGraphDatabase。这允许您为每个查询创建一个新数据库,同时(希望)仍然能够预热 JVM。此外,如果您的目标是测量较大的特征性能差异(例如 1-2 个数量级),您不需要对基准测试细节过于挑剔 - 如果查询在现实生活中慢 10-100 倍,基准可能会显示出显着差异。
    • 嗯,谢谢。但就我而言,这并不容易。我使用一个通过 REST 与 Neo4j 通信的应用程序和一个使用 bolt 的 Python 脚本(仅用于我的原型)。此外,我需要数据库中的特定数据。这意味着我必须先通过代码执行 1000 条语句,然后才能开始实际测试。非常感谢您的帮助,但我不确定这是否适用于我的情况。
    猜你喜欢
    • 2014-07-30
    • 2014-12-19
    • 2020-09-27
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多