Я борюсь с результатами нагрузочного теста моего API-сервиса.Служба развернута на GCP.За nginx работает 2 экземпляра.
Я использую весеннюю загрузку 2.0 со стандартной конфигурацией Tomcat.Служба работает внутри док-контейнера с параметром -Xmx768M
. Запрос к тестируемой конечной точке выбирает одну строку из базы данных и возвращает ее.
Мои результаты:
ab -c 1 -n 1 / testapi
Requests per second: 15
Time per request: 63ms
ab -c 10 -n 100 /testapi
Requests per second: 102
Time per request: 97ms
ab -c 50 -n 100 / testapi
Requests per second: 95
Time per request: 522ms
ab -c 100 -n 100 / testapi
Requests per second: 93
Time per request: 1065ms
ab -c 200 -n 200 / testapi
Timeout
Аспекты беспокойства:
Использование кучи увеличивается после каждого теста
При использовании кучи на 99,99% я получаю медленные ответы, пока не произойдет сбой контейнера с java.lang.OutOfMemoryError: Javaпространство кучи
Я могу сделать 2 экземпляра API с одного ноутбука.
Что я здесь не так делаю?Конфигурация Tomcat нуждается в дальнейшей настройке?Параметры JVM неверны?
Спасибо
Редактировать проверенный код:
@ApiOperation(value="Get Device", response = Device.class, authorizations = {@Authorization(value = "Authorization")})
@RequestMapping(value="/device/commnr/{commnr}", method= RequestMethod.GET)
public DeferredResult<ResponseEntity> getDevice(@PathVariable String commnr) {
final DeferredResult<ResponseEntity> deferred = new DeferredResult<>();
HttpServletRequest request = getCurrentHttpRequest();
timer.schedule(new TimerTask() {
@Override
public void run() {
if(deferred.isSetOrExpired()) {
throw new RuntimeException();
} else {
User user = authenticationService.loginUser(request);
Device device = deviceService.findByCommNr(commnr);
if(!AuthTools.isUserDevice(device, user)) {
deferred.setResult(new ResponseEntity<>("Requested Device does not belong to user.", HttpStatus.FORBIDDEN));
}
if(device == null) {
deferred.setResult(new ResponseEntity<>(HttpStatus.NOT_FOUND));
}
deferred.setResult(new ResponseEntity<>(device, HttpStatus.OK));
}
}
}, 10);
return deferred;
}