如何监控内存使用情况并构建可扩展的Java Web服务器?

时间:2017-12-06 10:12:35

标签: java

我们正在编写一个带有Java的Web应用程序,它被用作由WebSocket支持的聊天室服务器。我们正确设计服务器结构,以便我们可以运行多个相同的服务器实例来支持大规模连接和通信。问题是我们无法动态扩展服务器集群。理想情况下,任何从节点都应监视其内存使用情况,并在无法接受更多连接时通知专用主节点。现在,当过多的连接迅速进入时,Web应用程序就会崩溃。是否有任何解决方案(或想法)来改善这种情况?

2 个答案:

答案 0 :(得分:0)

在java中,检查有关当前集群的一些信息非常容易。

MemoryUsage heapMemoryUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage();
heapMemoryUsage.getUsed();

如果要检查该群集的JVM运行时总内存,请参阅此示例。

public class TestMemory {

    public static void main(String [] args) {

        int mb = 1024*1024;

        //Getting the runtime reference from system
        Runtime runtime = Runtime.getRuntime();

        System.out.println("##### Heap utilization statistics [MB] #####");

        //Print used memory
        System.out.println("Used Memory:" 
            + (runtime.totalMemory() - runtime.freeMemory()) / mb);

        //Print free memory
        System.out.println("Free Memory:" 
            + runtime.freeMemory() / mb);

        //Print total available memory
        System.out.println("Total Memory:" + runtime.totalMemory() / mb);

        //Print Maximum available memory
        System.out.println("Max Memory:" + runtime.maxMemory() / mb);
    }
}

所以,现在任何子节点都知道他们是谁的极限。如果你有一个开放的WebSocket通信,你应该对所有子节点执行ping操作并检查它们的状态,如果它们负载很重,你可以动态地实例化一个新节点,例如,使用Docker使事情变得更容易。 (只需在基于云的服务器上部署新的Docker容器,连接到主节点(您可以使用Node.js最终通过WebSocket连接到主节点,这样您甚至可以在JVM实际启动之前连接。) "嘿,这里的新节点,给我做一些事情"。在内部,我不知道将流量从一个节点重定向到另一个节点会有多远,但我希望这个想法。如果你想要更准确的连接(更少的崩溃)不只是看内存使用情况,但网络使用情况,如果任何TCP软件包丢失或websocket突然关闭,服务器应立即告诉主节点创建它的新实例。

答案 1 :(得分:0)

尝试使用JProfiler或IntelliJ等工具来了解应用程序在过载情况下的行为,也可以帮助您注意是否有一些不会被垃圾收集的线程等等。 像上面提到的那样的工具可以检查你的web服务器或jvm上的负载,但是你的应用程序被部署用于识别是否需要扩展硬件或只是应用程序更正就足够了。

使应用程序过载的工具是Jmeter,它可以帮助您长时间进行压力测试。

相关问题