2015-01-06 3 views
1

Я использую 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 для высокой нагрузки.

Итак, вопрос в том, есть ли какая-либо конфигурация, которую я пропускаю, чтобы свести к минимуму процессор? Или это ожидается и может быть исправлено только путем добавления большего количества процессоров или кластеризации сервисов?

Благодарим за помощь.

ответ

0

Вы заявляете, что выполняете часть ExecutorService на другой машине, но URL-адрес: http://localhost:8080. Это не-нет в нагрузочном тестировании.

Некоторые советы:

  • Не имеют нагрузки клиента и нагрузку на сервер на той же машине (не обманет и пытаться поставить нагрузку на 2 разных виртуальных машин на одной физической машине)
  • Используйте несколько клиентских машин, а не только 1 (когда разработчики Jetty тестируют характеристики загрузки, мы используем соотношение клиентских машин как минимум 10: 1 к серверным машинам)
  • Не тестируйте с помощью loopback, виртуальных сетевых интерфейсов, localhost, и т. д. Используйте реальный сетевой интерфейс.
  • Не тестируйте с нереалистичными сценариями нагрузки. Реальным использованием вашего сервера будет большинство HTTP/1.1 конвейерных соединений с несколькими запросами на физическое соединение. Некоторые на быстрых сетях, некоторые на медленных сетях, некоторые даже на ненадежных сетях (думаю, мобильные)
  • Если вы должны использовать HttpURLConnection, поймите, как он управляет своими HTTP-версиями + соединениями (такими как keep-alive или http/1.1 close) и убедитесь, что вы прочитали содержимое тела ответа, закройте потоки и disconnect() the connection.

И, наконец, be sure you are testing load in realistic ways.

+0

Спасибо за подробный ответ. Для меня это мало. Да, код говорит это как localhost, но когда я скопировал его на другую машину, я изменил ее. – user1401472

Смежные вопросы