【问题标题】:Apache Ignite cache put and get are slowApache Ignite 缓存 put 和 get 很慢
【发布时间】:2017-07-14 15:58:57
【问题描述】:

我没有获得使用 Apache Ignite DataGrid 所期望的性能。我尝试了一些配置更改,但此时不知道如何调查性能瓶颈,正在寻求专家帮助。

我正在使用 Apache Ignite 使用我称为 ByteArray 的包装类来缓存字节数组。我的测试代码尝试通过调用多个 put 然后从另一个进程多次获取来对缓存性能进行基准测试。我尝试在同一节点和不同节点上运行 get 进程。我还使用 Java HashMap 作为我的缓存创建了一个基准性能规范,这具有更好的性能(10000x for put)。

现在,在同一个节点上,我得到以下信息:
Hashmap缓存,同节点:put 2600 MB/s;获得 300 MB/秒
点燃同一个节点缓存:put 0.4 MB/s;获得 2.0 MB/秒
点燃缓存,2个节点:放0.3 MB/s;获得 0.7 MB/s

我在复制模式下运行了这些,但在分区模式下我看到了类似的结果。我运行测试的多次迭代并平均时间。我的节点有 25GB 内存,我的测试消耗了 ~1GB。我已将 VM 配置为最大使用 10GB。

【问题讨论】:

    标签: java performance caching ignite


    【解决方案1】:

    首先,将 Ignite 性能与 HashMap 进行比较没有多大意义。 Ignite 是一个分布式和可扩展的系统,而HashMap 甚至不是线程安全的。

    您使用HashMap 作为基线的事实让我认为您的测试是单线程的。如果您尝试从多个线程/客户端查询 Ignite,我相信您会注意到更好的吞吐量。

    另外请记住,使用 Ignite 意味着通过网络发送数据。您可能会受到速度的限制。

    【讨论】:

    • 我理解您所说的关于线程和 Ignite 的分布式特性的内容,但我创建 HashMap 示例纯粹是为了了解我的节点上的原始性能(并发现我的基准代码中的错误)。 Ignite 时间与 2 个客户端(相同节点和 2 个节点案例)一起使用,这就是我获得低性能的地方。我想知道我是否错误地使用了 Ignite。我需要在 N 个节点上执行一系列 put,然后在这些节点中的任何一个上执行 get。 Ignite 是正确的工具吗?我可以期待以 MB/s 为单位的性能吗?
    • 这就是重点。您正在将本地非线程安全映射与意味着网络通信的分布式集群进行比较。这是绝对无效的比较。无论您做什么,都应尽量减少跨网络传输的数据量,例如使用亲和搭配:apacheignite.readme.io/docs/affinity-collocation。至于确切的吞吐量数字,几乎没有限制,因为 Ignite 可以通过添加更多节点来扩展。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 2020-08-16
    • 2017-10-01
    • 2021-11-17
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多