2014-11-04 2 views
0

HTTP 요청을 통해 서버에 대한 여러 요청을 처리하는 응용 프로그램이 있습니다. 나는 응답을 벤치 마크하려고 노력하고있다. 나는 속도면에서 무엇을 기대해야하는지 모른다. 동일한 샘플을 테스트하기 위해이 샘플 프로그램을 작성했습니다.이 프로그램에서 기대해야 할 속도는 무엇입니까? 내가 느끼는 초당 약 4000 건의 요청이 QUITE보다 적습니다. 친절하게 도와주세요.HTTP 서버 속도

HttpClient를 :

package my.service; 

import java.io.ByteArrayOutputStream; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.util.Date; 

public class TestClient { 

    public static void main(String[] args) throws Exception { 
     Date date = new Date(); 

     for (int i = 0; i < 100000; i++) { 
      URL url = new URL("http://192.168.5.116:9999/testSpeed"); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 

      conn.setUseCaches(false); 
      conn.setDoInput(true); 
      conn.setDoOutput(true); 

      conn.connect(); 

      InputStream stream = conn.getInputStream(); 
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      byte[] b = new byte[1]; 
      while (stream.read(b) != -1) { 
       bos.write(b); 
      } 

      byte[] byteArray = bos.toByteArray(); 
      String response = new String(byteArray); 
      if (Integer.parseInt(response) % 1000 == 0) { 
       System.out.println("Response from server is --> " + response); 
      } 
     } 

     Date d1 = new Date(); 
     System.out.println(d1.getTime() - date.getTime()); 
    } 

}

HTTP 서버 : 모든

package my.service; 

import java.io.IOException; 
import java.io.OutputStream; 
import java.net.InetSocketAddress; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

import com.sun.net.httpserver.HttpExchange; 
import com.sun.net.httpserver.HttpHandler; 
import com.sun.net.httpserver.HttpServer; 

public class TestServer { 

    public static void main(String[] args) throws Exception { 
     HttpServer server = HttpServer.create(new InetSocketAddress(9999), 0); 

     ExecutorService executorService = Executors.newFixedThreadPool(10); 
     server.setExecutor(executorService); 

     server.createContext("/testSpeed", getHandler()); 
     server.start(); 
    } 

    private static HttpHandler getHandler() { 
     return new TestHandler(); 
    } 

    private static class TestHandler implements HttpHandler { 

     int i = 0; 

     @Override 
     public void handle(HttpExchange request) throws IOException { 
      i++; 
      if (i % 1000 == 0) { 
       System.out.println("Number of requests received --> " + i); 
      } 

      String response = i + ""; 
      request.sendResponseHeaders(200, response.getBytes().length); 

      OutputStream os = request.getResponseBody(); 
      os.write(response.getBytes()); 
      os.close(); 
     } 

    } 

} 
+0

잘못된 접근입니다. 이러한 기본적인 테스터에는 최적화되지 않은 스레드 풀 관리 및 실제 비즈니스 논리의 부적절한 시뮬레이션과 같은 여러 가지 결함이 있습니다. 대신 애플리케이션이 처리 할 것으로 예상되는로드 유형을 확인하고 앱이 해당 요구 사항을 충족하는지 확인해야합니다. 필요하지 않은 경우 시간은 어디에서 취해지며 부족한 점을 해결하는 방법은 무엇입니까? – PaulProgrammer

+0

최적화가 좋아? 비즈니스 로직은 매우 간단합니다. 문제가 있다고 생각하지 않습니다. 스레드 풀을 최적화하는 방법? – LPD

+0

잘 모르겠습니다. 이 예제는 너무 간단하여 실제로 가치있는 통찰력을 제공하지 못합니다. 컨설팅 서비스를 원할 경우 다른 채널에서 나에게 연락하십시오. – PaulProgrammer

답변

0

첫째, 거의 모든 응용 프로그램 서버는 고정 된 크기의 스레드 풀을 사용합니다. 그 접근법은 좋지만이 반응이 너무 단순하다는 것을 알고 있습니다. 어떤 상황에서는 데이터베이스에 가서 응답을 기다려야합니다. 그런 경우 정확한 응답 시간을 시뮬레이션 할 수 없습니다.

첫 번째 우려는 응답 속도가 아닙니다. 응용 프로그램 서버의 스레드 풀 크기를 구성 할 수 있습니다 (구성 가능). 또한 트래픽이 너무 많아서 둘 이상의 서버를 열어야하는 경우 (로드 밸런서를 사용할 수도 있습니다.)

제 생각에는 제품이 살아 난 후에이 상황을 고려해야하지만 둘 이상의 서버에 대한 코드를 구현해야합니다.