Использование процессора идет очень высоко для асинхронного API - PullRequest
1 голос
/ 07 ноября 2019

У меня есть API, который используется для хранения данных в DynamoDB, я использую Google ListeningExecutorService для отправки заданий, которые в конечном итоге отправляют данные в БД. но использование cpu становится действительно высоким, и я не могу отладить почему.

Вот код:

@Timed(AuditConstants.CRITICAL_TIMER_PREFIX + "sendMessage")
public void save(Audit audit) {
    Callable callable = new CallableResult(auditRepository,auditDataUtils,audit);

    ListenableFuture<Result> future = executorService.submit(callable);

    Futures.addCallback(future, new FutureCallback<Result>() {
        @Override
        public void onSuccess(@Nullable Result result) {
            log.info("Successfully sent audit with uuid {} to Dynamo DB", audit.getAuditId());
        }

        @Override
        public void onFailure(Throwable throwable) {
            log.info(ERROR_WHILE_SENDING_THE_MESSAGE, throwable);
            handleException(audit, throwable);
        }
    });

}

private void handleException(Audit audit, Throwable ex) {

    log.info("Failed talking to Dynamo DB, writing audit with uuid {} to file", audit.getAuditId(), ex);
    producerAuditEventsLogger.logToFile(audit);
}

CallableResult job

@Override
    public Result call() throws Exception {
        try {
            AuditData auditData = auditDataUtils.getAuditData(audit);
            auditRepository.saveAuditData(auditData);
            return new Result(SUCCESS);
        } catch (Exception e) {
            throw new Exception("There was an error while writing to DB",e);
        }
    }

Загрузка ЦП достигает 70% для For 3 узла (c4x большой) для 1300 т / с.

Время отклика очень мало ~ 20 мс

Пожалуйста, помогите мне, как я могу отладить, и каковыРекомендуемые способы понижения процессора.

Спасибо

1 Ответ

1 голос
/ 07 ноября 2019

Вы можете попробовать выполнить следующие действия:

  1. Проверьте, не выполняете ли вы слишком много работы внутри потока
  2. Проверьте, не выполняются ли операции БД слишком долго, илите, которые занимают ЦП (если на том же узле).

  3. Посмотрите на визуальный снимок виртуальной машины и попытайтесь выяснить, какой поток потребляет больше ЦП.

  4. Или ваша работа запланирована на очень высокую частоту, что приводит к созданию слишком большого количества потоков.

Мне кажется, что ваши операции с БД вызывают это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...