配置Jetty以获得高请求量

时间:2013-01-09 23:13:49

标签: java performance http jetty

在我们的应用程序中,我们需要处理超过每秒5,000个请求的请求量。我们被告知,Jetty在我们的应用程序类型中是可行的(我们必须将JSON-HTTP API公开给远程系统,然后远程系统将启动入站请求和连接到我们)。

我们收到数千个入站HTTP连接,每个连接都是持久的,持续时间约为30秒。然后,远程服务器会立即向我们发出请求,因为我们可以在每个连接上对它们做出响应。 30秒后,连接关闭,另一个打开。我们必须在不到100毫秒(包括网络传输时间)内做出响应。

我们的服务器在EC2中运行,内存为8GB,其中4GB分配给我们的Java VM(过去的研究表明你不应该将超过一半的可用内存分配给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();

请注意,我们最初在我们的线程池中只有512个线程,我们尝试增加到5120,但这没有明显的帮助。

我们发现,通过此设置,我们很难处理每秒超过300个请求。我们不认为问题是我们的处理程序,因为它只是做一些快速计算,以及Gson序列化/反序列化。

当我们在尝试处理此负载时手动执行我们自己的HTTP请求时,我们发现它可能需要几秒钟才能开始响应。

我们正在使用Jetty版本7.0.0.pre5。

任何建议,无论是解决方案,还是隔离瓶颈的技术,都将受到赞赏。

1 个答案:

答案 0 :(得分:25)

首先,Jetty 7.0.0.pre5 非常旧。 Jetty 9现已推出,并且许多性能优化。

下载更新版本的7.x系列 https://www.eclipse.org/jetty/previousversions.html

记录了以下建议

请务必阅读它们。

接下来,线程池大小用于处理接受的请求,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“停止世界”事件需要花费大量时间,那么您就会知道导致性能问题的另一个原因。

相关问题