【问题标题】:How much data is too much for on-heap java cache? When should I start to think about off-heap cache?堆上 Java 缓存有多少数据太多?我应该什么时候开始考虑堆外缓存?
【发布时间】:2012-02-14 17:40:06
【问题描述】:

对于像 ehcache 这样的堆上缓存来说,多少数据太多了?

我要购买 24GB RAM 服务器。我可能会开始使用 2-4 GB 进行缓存,但最终可能会使用 20GB 左右的缓存。什么时候我应该担心堆上缓存的 GC 会花费太长时间?

顺便问一下,DirectMemory 是唯一可用的开源堆外缓存吗?准备好迎接黄金时段了吗?

【问题讨论】:

  • 您的问题的答案更多地取决于缓存使用特性而不是缓存大小。例如,读/写比率、TTL、您正在存储的对象的大小、您可以存储的对象数量。另外,您的问题是在问一个非常模糊的问题。你认为“太长”是什么意思?或“准备好迎接黄金时段了吗?”在真正评估任何缓存解决方案之前,您必须知道需要什么样的 SLA。最大响应时间(毫秒)和 SLA 命中百分比。

标签: java caching ehcache directmemory


【解决方案1】:

取决于您的 JVM,尤其是使用的 GC。尤其是较旧的 GC 并不能真正处理非常大的堆,但人们正在努力解决这个问题。

例如,由于special GC,Azul 系统销售具有数百 GB 堆的硬件而没有问题(即 gc 在 ms 中暂停而不是半分钟),因此它不受 Java 本身的限制。不知道热点/IBM随着时间的推移有多好。但是无论如何,一个 24gb 的堆并没有那么大 - G1 应该可以在那里做得足够好。

【讨论】:

    【解决方案2】:

    什么时候我应该担心堆上缓存的 GC 会花费太长时间?

    多长时间才算过长?

    说真的,如果您正在运行“吞吐量”垃圾收集器并且这给您带来了太长的暂停,那么您应该尝试切换到低暂停收集器;例如CMS 或 G1。

    【讨论】:

      【解决方案3】:

      大缓存的主要问题是完整的 GC 时间。给你一个想法,它可能是每 GB 1 秒(这因应用程序而异)如果你有一个 20 GB 的缓存并且你的应用程序每隔一段时间就会暂停 20 秒,这是可以接受的吗?

      作为直接和内存映射文件的粉丝,我倾向于考虑何时不将数据放在堆外,而为了简单起见只使用堆。 ;) 无论大小如何,内存映射文件对完整 GC 时间几乎没有影响。

      使用内存映射文件的优点之一是它可以比您的物理内存大得多,并且性能仍然相当好。这让操作系统决定哪些部分应该在内存中,哪些需要刷新到磁盘。

      顺便说一句:拥有更快的 SSD 也有帮助 ;) 更大的驱动器也往往更快。检查它们可以执行的 IOP。

      在这个例子中,我创建了一个 8 TB 的文件内存,映射到一台 16 GB 的机器上。 http://vanillajava.blogspot.com/2011/12/using-memory-mapped-file-for-huge.html

      注意,它在 80 GB 文件示例中表现更好,8 TB 可能会过度杀戮。 ;)

      【讨论】:

        猜你喜欢
        • 2021-09-12
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多