我有一个用于将数据存储在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的推荐方法是什么。
谢谢
您可以按照以下说明尝试:
查看数据库操作是否花费太长时间执行或者是占用CPU(如果在同一节点上)。
查看可视VM快照,并尝试找出哪个线程占用更多CPU。
或者您的作业计划以很高的频率运行,从而导致创建太多线程。
在我看来,您的数据库操作正在引起它。