Нагрузочное тестирование микросервиса - плохие результаты - PullRequest
0 голосов
/ 20 ноября 2018

Я борюсь с результатами нагрузочного теста моего 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...