如何解决Spring Boot 应用程序性能下降
我有一个非常基本的 Spring boot 应用程序,它为一个非常简单的实体公开了 CRUD Rest API。使用 JMeter 运行性能测试显示非常糟糕的响应时间
Product (id,name,description)
约束条件:id PK AUTOINCREMENT
设置:
- 线程数:100
- 加速时间:10(秒)
- 无限循环
- 持续时间:60(秒)
公开的 4 个 API 用于执行以下功能
@Override
public Product findById(Integer id) {
return repository.findById(id)
.map(mapper::map)
.orElseThrow(() -> new RecordNotFoundException(1,"Product not found"));
}
@Transactional
@Override
public Product create(Product Product) {
ProductEntity entity = mapper.map(Product);
repository.save(entity);
return mapper.map(entity);
}
@Transactional
@Override
public Product update(Integer id,Product Product) {
ProductEntity entity = repository.findById(id).orElseThrow();
mapper.mapTo(entity,Product);
repository.save(entity);
return mapper.map(entity);
}
@Transactional
@Override
public void delete(Integer id) {
repository.deleteById(id);
}
我已经尝试通过可视化 VM 来查看原因。似乎存储库功能花费了太多时间。我认为是导致问题的数据库。
连接池设置:因为我没有设置任何东西并且假设我的应用程序正在使用 HikariCP 并且默认大小为 100。
数据库:对于上述结果,尝试使用 MySQL(innodb 引擎)并禁用了自动提交。
Spring Boot 版本: 2.4.0
系统:16GB RAM,酷睿 i7
问题:
连接池或数据库是否是这里的瓶颈?池大小的最佳值是什么以减少响应时间?
为什么所有 API 在图表中都遵循相同的趋势 - 一起上升或下降?
更新:
- 根据建议将所有这些都托管在一台单独的机器上(基于云)
- 稍微分析一下 - 存储库需要时间 (com.sun.proxy.$.methodName)
解决方法
我能想到以下可能的原因:
- 运行 Spring Boot 应用程序的机器缺少资源(CPU、RAM 等) - 确保使用 JMeter PerfMon Plugin 等方式监控它们
- 使用 YourKit 或 JProfiler 等分析器工具查看应用程序在何处花费的时间最多
- 如果您认为问题出在数据库中:
- 确保正确设置数据库引擎,即遵循Optimization tips and tricks
- 也可能是您的查询效率不高,因此请检查 query execution plans,只需添加相关的 indices 可能会大大加快速度
你可以通过这些来找到问题:
1- 使用 Gatling 进行性能测试,它使用较低的资源并且不会影响您的结果。
2- 使用 APM 代理来准确监控什么是耗时的进程,是数据库查询,还是不是 (APM)
3- 使用 undertow 代替 tomcat 或其他网络应用程序
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。