san*_*ity 17 java performance http jetty
在我们的应用程序中,我们需要处理超过每秒5,000个请求的请求量.我们被告知,Jetty在我们的应用程序类型中是可行的(我们必须将JSON-HTTP API暴露给远程系统,然后远程系统将启动入站请求和连接到我们).
我们收到数千个入站HTTP连接,每个连接都是持久的,持续时间大约为30秒.然后,远程服务器会立即向我们发出请求,因为我们可以在每个连接上对它们做出响应.30秒后,连接关闭,另一个打开.我们必须在不到100毫秒(包括网络传输时间)内做出响应.
我们的服务器在EC2中运行,内存为8GB,其中4GB分配给我们的Java VM(过去的研究表明,不应该将超过一半的可用RAM分配给JVM).
以下是我们目前如何根据我们在网上阅读的各种提示初始化Jetty:
Server server = new Server();
SelectChannelConnector connector = new SelectChannelConnector();
connector.setPort(config.listenPort);
connector.setThreadPool(new QueuedThreadPool(5120));
connector.setMaxIdleTime(600000);
connector.setRequestBufferSize(10000);
server.setConnectors(new Connector[] { connector });
server.setHandler(this);
server.start();
Run Code Online (Sandbox Code Playgroud)
请注意,我们最初在我们的线程池中只有512个线程,我们尝试增加到5120,但这没有明显的帮助.
我们发现,通过这种设置,我们很难处理每秒超过300个请求.我们不认为问题是我们的处理程序,因为它只是做一些快速计算,以及Gson序列化/反序列化.
当我们在尝试处理此负载时手动执行我们自己的HTTP请求时,我们发现它可能需要几秒钟才能开始响应.
我们使用的是Jetty版本7.0.0.pre5.
任何建议,无论是解决方案,还是隔离瓶颈的技术,都将受到赞赏.
Joa*_*elt 26
首先,Jetty 7.0.0.pre5 非常老旧.Jetty 9现已推出,并且有许多性能优化.
在https://www.eclipse.org/jetty/previousversions.html下载更新版本的7.x系列
以下建议记录在
一定要读它们.
接下来,线程池大小用于处理接受的请求,512为高.5120很荒谬.选择一个高于50且小于500的数字.
如果您有基于Linux的EC2节点,请确保在操作系统级别配置网络以获得最大收益.(有关详细信息,请参阅上述列表中标题为"高负载"的文档)
确保使用的是最新的JRE/JDK,例如Oracle Java 1.6u38或1.7u10.此外,如果您有64位操作系统,请使用64位JRE/JDK.
将接受器计数SelectChannelConnector.setAcceptors(int)设置为1和(number_of_cpu_cores - 1)之间的值.
最后,设置优化的垃圾收集,并打开GC Logging以查看您遇到的问题是使用jetty还是使用Java的GC.如果您通过GC记录看到有大量GC"停止世界"事件需要花费大量时间,那么您就会知道另一个导致性能问题的原因.
归档时间: |
|
查看次数: |
39732 次 |
最近记录: |