Cpu 异步的利用率非常高 api

Cpu utilization goes really high with for asynch api

我有一个 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 作业

@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 3 个节点(c4x 大)的利用率达到 70%,达到 1300 tps。

响应时间很低~20ms

请指导我如何调试,以及降低 cpu 的推荐方法。

谢谢

您可以按照以下方向尝试:

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

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

  4. 或者您的作业被安排为 运行 的频率非常高,导致创建的线程过多。

在我看来,这似乎是您的数据库操作造成的。