1

以下のコードでは、DataGather = endDataGather - beginDataGather は 1.7 ミリ秒かかり、サービスが応答するまでの時間 = service_COMPLETED - service_REQUEST_SENT は 20us から 200us まで変化します (同じ LAN でダミーのダミーであるため、非常に低いため) tomcat8 スレッドを 10 から 10 に増やすと、 200、DataGather は 150ms + に増加し、スレッドを 200 から 1000 に増やしても 250+ に増加します。マシン仕様 8 コア Xenon、64 GB RAM。apache ベンチマークが -n 40000 -c 100 args で実行されたときに時間が測定されます。これは、スレッドのスケジューリング/コンテキストの切り替えなどによるものですか? このバリエーションを取り除くにはどうすればよいですか?レイテンシが 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();
        }
       }
4

1 に答える 1

1

はい、スレッドのコンテキスト切り替えが原因のようです。この場合、スレッド数を増やしても役に立ちません。コールバックにスレッド プールを使用できます。このリンクを参照して確認し、 .PoolingClientAsyncConnectionManager を使用してみてください

マルチスレッド操作で HttpAsyncClient を使用するには?

于 2016-07-23T18:56:32.193 に答える