Высокая задержка при увеличении числа потоков
В приведенном ниже коде DataGather = endDataGather - beginDataGather занимает 1,7 мс и время для ответа службы = service_COMPLETED - service_REQUEST_SENT, который варьируется от 20us до 200 us(поскольку они являются фиктивными фиктивными на одной и той же локальной сети, следовательно, такими низкими), теперь, если я увеличу поток tomcat8 с 10 до 200,DataGather увеличится до 150 мс +, и даже если я увеличу поток с 200 до 1000, то он даже увеличится до 250+. Технические характеристики 8-ядерного ксенона,64 ГБ ОЗУ. Время измеряется, когда тест 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
Как использовать HttpAsyncClient с многопоточными операциями?