[英]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.