2016-07-23 107 views
1

在以下代碼DataGather = endDataGather - beginDataGather花費1.7ms &時間服務響應= service_COMPLETED - service_REQUEST_SENT 從20US變化到200我們(因爲它們是模擬虛設上同一LAN因此這樣低) 現在,如果我增加tomcat8線程從10到200,DataGather增加到150ms +,即使我增加線程從200到1000,那麼它甚至增加250 + .Machine規格8核心氙,64GB RAM。當apache基準測試運行時使用-n 40000 -c 100參數來衡量時間,這是由於線程調度/上下文切換還是其他原因造成的?我如何擺脫這種變化?當真正的服務會出現延遲20-100毫秒的圖像時,它會保持不變。上增加線程計數高延遲

 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