2015-01-06 3 views
1

Jetty를 사용하여 서비스로 기본 클래스를 시작합니다. 문제를 설명하기 위해 코드를 추출하십시오.Standalone 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(); 

이 응용 프로그램은 2 CPU가 장착 된 Windows 컴퓨터에서 실행됩니다.

이 응용 프로그램을 시작한 후에 다른 컴퓨터에서 아래 프로그램을 실행합니다. 아래 코드는 단지 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

다른 컴퓨터에서 ExecutorService 부분을 실행한다고 나와 있지만 URL은 http://localhost:8080입니다. 그것은로드 테스트에서 no-no입니다.

조언 :

  • (속임수와 하나의 물리적 시스템에서 2 개 개의 다른 가상 머신의 부하를 넣어하지 마십시오) 클라이언트로드와 동일한 시스템에서 서버 부하를하지 마십시오
  • Jetty 개발자가 부하 특성을 테스트 할 때 서버 시스템에 클라이언트 시스템을 적어도 10 : 1 비율로 사용하는 경우 여러 클라이언트 시스템을 사용하십시오.
  • 루프백, 가상 네트워크 인터페이스, 로컬 호스트, 실제 네트워크 인터페이스를 사용하십시오.
  • 비현실적인로드 시나리오로 테스트하지 마십시오. 실제 서버 사용은 실제 연결마다 여러 요청을하는 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