繁体   English   中英

如何监视内存使用情况并构建可伸缩的Java Web服务器?

[英]How to monitor memory usage and build scalable java web server?

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

在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突然关闭,服务器应立即通知主节点创建它的新实例。

尝试利用JProfiler或IntelliJ之类的工具来通知您的应用程序在过载情况下的行为,它还可以帮助您注意是否拥有一些未进行垃圾收集的线程等等。 上面提到的工具可以检查Web服务器或jvm上的负载,但是您的应用程序已部署,以确定是否需要扩展硬件,或者仅进行应用程序校正即可。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM