【问题标题】:Java balance the load into many JVMJava 将负载平衡到多个 JVM
【发布时间】:2014-08-17 08:34:01
【问题描述】:

我的 java 应用程序执行大量 IO 操作并消耗大量内存和 CPU(序列化和反序列化)。通常有时我的应用程序会在某些时候抛出内存异常,即使堆大小已经增加并且 GC 暂停时间减少了..:( 因此,无法获得预期的性能水平。我发现了一些问题like thiis。但他们是理论上的,找不到适合我的问题。

目前我在线程之间分担负载。我如何看待通过将负载放入不同的 JVM 是否可以获得任何性能改进。我想知道

  • 我们可以在不同的JVM之间共享应用程序任务吗?如果可以,如何?(任何例子?)会有性能提升吗?

【问题讨论】:

  • 是的,你可以。这并不容易,而且它可能不会给你带来比线程更好的性能。 (事实上​​它可能会让事情变慢)
  • 你可能想研究一下 Hadoop。
  • 您可以使用多台机器。如果您的 JVM 正在使用一台机器的所有资源,那么使用更多 JVM 只有在您使用更多机器时才会有所帮助。注意:如果您提高 CPU 和内存使用率,您可以将性能提高 10 倍或更多。在尝试水平扩展之前,我会确保您的应用程序已经过优化,
  • @PeterLawreyj > 感谢您的评论。一点不清楚。 “如果您的 JVM 正在使用一台机器的所有资源,那么使用更多 JVM 只有在您使用更多机器时才会有所帮助。注意:如果您提高 CPU 和内存使用率”。?您的意思是,如果现有的 jvm 消耗了所有资源,那么更多的 JVM 会提高性能吗?如果是这样,请提供任何资源或链接?
  • 如果可能的话,如果你觉得这会消耗更多时间,你可以考虑外部化而不是序列化

标签: java multithreading io jvm


【解决方案1】:

我的 java 应用程序执行大量 IO 操作并消耗大量内存 和 CPU(序列化和反序列化)。

您是指磁盘 I/O 还是网络 I/O 或两者兼而有之? 如果瓶颈是磁盘 I/O 并且您只有一个 SATA 硬盘,那么同一主机上的更多线程或 jvm 将无济于事。跨主机或其他磁盘选项的负载平衡会有所帮助。你需要尝试一下。

有时我的应用程序会抛出内存不足异常

这可能是由多种原因造成的。如果它是堆,并且如果您看到没有内存泄漏或不需要的内存利用率,那么增加堆可能会有所帮助。这可能会影响 gc 暂停时间。这取决于您已经拥有多少堆和 gc 选项。多个 jvm 可能会有所帮助。 创建大量线程也会导致OOM。

如果您受 CPU 限制,那么除非增加 CPU 数量,否则增加线程数或拥有多个 jvm 将无济于事。

跨多个 jvm 共享意味着运行应用程序的多个实例。这可以通过负载均衡器来实现。 [编辑] 不同的 jvm 可以通过 RMI 等相互通信,但我想你并没有真正关注进程间通信。

第一步是通过分析和负载测试确定瓶颈,然后开始调整。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2017-09-21
    • 2022-01-10
    • 2022-06-13
    相关资源
    最近更新 更多