1

- beginDataGather은 = service_COMPLETED 응답 서비스 & 시간 1.7ms 소요 - (200) 우리 (로의 20us 다를 service_REQUEST_SENT 을 그들은 따라서 이렇게 동일한 LAN에 더미를 조롱하고 있기 때문에 낮은) 지금 tomcat8 스레드를 10에서 200으로 늘리면 DataGather가 150ms +로 증가하고 심지어 200에서 1000으로 스레드가 증가하더라도 250 + .Machine 사양 8 코어 Xenon, 64GB RAM이 증가합니다. 시간은 아파치 벤치 마크가 -n 40000 -c 100 args로 실행될 때 측정됩니다. 이것은 스레드 스케줄링/컨텍스트 전환 또는 다른 이유로 인한 것입니까? 이 유사 콘텐츠를 제거하려면 어떻게해야합니까? 20-100ms의 대기 시간을 갖는 실제 서비스가 그림으로 나타날 때까지 남아있을 것입니다.높은 대기 시간 아래 코드 DataGather = endDataGather에서

 public List<ServiceResponse> getData(final List<Service> services, final Data data) { 
      //beginDateGather; 

      final List<ServiceResponse> serviceResponses = Collections.synchronizedList(new ArrayList<>()); 
      try { 
      final CountDownLatch latch = new CountDownLatch(services.size()); 
      Map<Future<HttpResponse>, HttpRequestBase> responseRequestMap = new HashMap<Future<HttpResponse>, HttpRequestBase>(); 

      for (final service service : services) { 
       //creating request for a service 
       try { 
       HttpRequestBase request = RequestCreator.getRequestBase(service, data); 
       //service_REQUEST_SENT 
       Future<HttpResponse> response = client.execute(request, 
        new MyFutureCallback(service, data, latch, serviceResponses)); 
       responseRequestMap.put(response, request); 
       } catch (Exception e) { 
       latch.countDown(); 
       } 
      } 
      try { 
       boolean isWaitIsOver = latch.await(timeout, TimeUnit.MILLISECONDS); 
       if (!isWaitIsOver) { 
       for (Future<HttpResponse> response : responseRequestMap.keySet()) { 
        if (!response.isDone()) { 
        response.cancel(true); 
        } 
       } 
       } 
      } catch (InterruptedException e) { 
      } 
      } catch (Exception e) { 
      } 
      //endDataGather 
      return serviceResponses; 
    } 


    public class MyFutureCallback implements FutureCallback<HttpResponse> { 

     private Service service; 
     private Data data; 
     private CountDownLatch latch; 
     private List<serviceResponse> serviceResponses; 

     public MyFutureCallback(Service service, Data data, CountDownLatch latch, List<ServiceResponse> serviceResponses) { 
      this.service = service; 
      this.data = data; 
      this.latch = latch; 
      this.serviceResponses = serviceResponses; 
     } 

     @Override 
     public void completed(HttpResponse result) { 
      try { 
      ServiceResponse serviceResponse = parseResponse(result, data, service); 
       serviceResponses.add(serviceResponse); 
      } catch (Exception e) { 
      } finally { 
      //service_COMPLETED 
      latch.countDown(); 
      } 
     } 

     @Override 
     public void failed(Exception ex) { 
      latch.countDown(); 
     } 

     @Override 
     public void cancelled() { 
      latch.countDown(); 
     } 
     } 

답변

1

예 스레드의 컨텍스트 전환 때문입니다. 이 경우 스레드 수를 늘리는 것이 도움이되지 않습니다. 콜백에 스레드 풀을 사용할 수 있습니다. 참조를 위해이 링크를 확인하고 .PoolingClientAsyncConnectionManager

How to use HttpAsyncClient with multithreaded operation?를 사용하려고

+0

콜백은 이미 IO Dispacter 스레드 풀에 의해 실행된다 – Shashank