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 的推荐方法。
谢谢
您可以按照以下方向尝试:
- 检查您是否在线程内做了太多工作
查看数据库操作是否执行时间过长或占用 CPU(如果在同一节点上)。
查看可视化 VM 快照并尝试找出哪个线程占用更多 CPU。
或者您的作业被安排为 运行 的频率非常高,导致创建的线程过多。
在我看来,这似乎是您的数据库操作造成的。
我有一个 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 的推荐方法。
谢谢
您可以按照以下方向尝试:
- 检查您是否在线程内做了太多工作
查看数据库操作是否执行时间过长或占用 CPU(如果在同一节点上)。
查看可视化 VM 快照并尝试找出哪个线程占用更多 CPU。
或者您的作业被安排为 运行 的频率非常高,导致创建的线程过多。
在我看来,这似乎是您的数据库操作造成的。