对于异步api,CPU利用率非常高

问题描述 投票:1回答:1

我有一个用于将数据存储在DynamoDB中的api,我正在使用Google的ListeningExecutorService提交作业,最终将数据发送到DB。但是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作业

@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);
        }
    }

[CPU使用率在1300 tps的3个节点(c4x大)上达到70%。

响应时间很短〜20ms

请指导我如何调试,以及降低CPU的推荐方法是什么。

谢谢

java amazon-web-services executorservice
1个回答
1
投票

您可以按照以下说明尝试:

  1. 检查线程中是否做过多工作
  2. 查看数据库操作是否花费太长时间执行或者是占用CPU(如果在同一节点上)。

  3. 查看可视VM快照,并尝试找出哪个线程占用更多CPU。

  4. 或者您的作业计划以很高的频率运行,从而导致创建太多线程。

在我看来,您的数据库操作正在引起它。

© www.soinside.com 2019 - 2024. All rights reserved.