【发布时间】:2013-01-09 23:13:49
【问题描述】:
在我们的应用程序中,我们需要处理每秒超过 5,000 个请求的请求量。有人告诉我们,在我们的应用程序类型中使用 Jetty 是可行的(我们必须将 JSON-HTTP API 暴露给远程系统,然后远程系统将启动入站请求和与我们的连接)。
我们收到数千个入站 HTTP 连接,每个连接都是持久的,持续大约 30 秒。然后,远程服务器会尽快向我们发出请求,因为我们可以在每个连接上响应它们。 30 秒后连接关闭并打开另一个连接。我们必须在 100 毫秒(包括网络传输时间)内做出响应。
我们的服务器在具有 8GB RAM 的 EC2 中运行,其中 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();
请注意,我们的线程池中最初只有 512 个线程,我们尝试将其增加到 5120,但这并没有明显帮助。
我们发现,使用这种设置,我们很难每秒处理 300 多个请求。我们认为问题不在于我们的处理程序,因为它只是进行一些快速计算,以及 Gson 序列化/反序列化。
当我们在尝试处理此负载时手动执行自己的 HTTP 请求时,我们发现它可能需要几秒钟才能开始响应。
我们使用的是 Jetty 版本 7.0.0.pre5。
对于解决方案或隔离瓶颈的技术的任何建议,我们将不胜感激。
【问题讨论】:
标签: java performance http jetty