我正在使用Jetty将主类作为服务启动。下面是代码的摘录,用于演示问题。
Server server = new Server(8080);
ResourceHandler resource_handler = new ResourceHandler();
resource_handler.setDirectoriesListed(true);
resource_handler.setWelcomeFiles(new String[] {"index.html"});
resource_handler.setResourceBase(".");
HandlerList handlers = new HandlerList();
handlers.setHandlers(new Handler[] {resource_handler, new DefaultHandler()});
server.setHandler(handlers);
server.start();
server.join();
我在带有2个CPU的Windows机器上从eclipse运行这个应用程序。
启动此应用程序后,我在不同的机器上执行以下程序。下面的代码只生成100个并发线程并执行一个简单的http请求来获取index.html页面。
ExecutorService service = Executors.newFixedThreadPool(100);
for (int i = 0; i < 10000; i++) {
service.execute(new Runnable() {
public void run() {
try {
long startTime = System.nanoTime();
URL url = new URL("http://localhost:8080");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("GET");
long endTime = System.nanoTime();
System.out.println(conn.getResponseMessage() + ":" + ((endTime - startTime)/1000000) + " (ms)");
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
service.shutdown();
当我执行此程序时,服务器的CPU立即达到100%(对于两个核心)。
我尝试按https://wiki.eclipse.org/Jetty/Howto/High_Load中的建议修改maxThreads,acceptorThreads,缓冲区大小参数。
但即便如此,CPU仍然会在95-100之间保持高负荷。
所以这里的问题是,是否有任何配置我缺少最小化CPU?或者这是预期的,只能通过添加更多CPU或集群服务来纠正?
感谢您的帮助。
答案 0 :(得分:0)
您声明您在其他计算机上运行ExecutorService部分,但URL为http://localhost:8080
。这是负载测试中的禁忌。
一些建议: