Я использую Jetty для запуска основного класса в качестве сервиса. Ниже выдержки из кода, чтобы продемонстрировать проблему.CPU застрял между 95% и 100% для сервера автономного сервера
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();
Я запускаю это приложение из 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();
При выполнении этой программы процессор сервера сразу достигает 100% (для обоих ядер).
Я пробовал модифицировать maxThreads, acceptorThreads, параметры размера буфера, как предложено в https://wiki.eclipse.org/Jetty/Howto/High_Load.
Но даже тогда процессор по-прежнему остается застрявшим между 95-100 для высокой нагрузки.
Итак, вопрос в том, есть ли какая-либо конфигурация, которую я пропускаю, чтобы свести к минимуму процессор? Или это ожидается и может быть исправлено только путем добавления большего количества процессоров или кластеризации сервисов?
Благодарим за помощь.
Спасибо за подробный ответ. Для меня это мало. Да, код говорит это как localhost, но когда я скопировал его на другую машину, я изменил ее. – user1401472