在我们的应用程序中,我们需要处理每秒超过 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。
任何关于解决方案或隔离瓶颈的技术的建议都将不胜感激。