Spring Restful API - 有时,响应时间太长
Posted
技术标签:
【中文标题】Spring Restful API - 有时,响应时间太长【英文标题】:Spring Restful API - Sometimes, response time is too long 【发布时间】:2021-12-13 17:15:29 【问题描述】:有一个我操作的服务器。 我用 Spring Boot 构建了一个 Restful API 服务器,当我用 Postman 测试我的 API 时,通常需要大约 20 毫秒到 50 毫秒才能响应。但有时响应时间长达 5.2 秒。
我想找出原因,所以我试图检查瓶颈发生在哪里。 当我通过在 InterceptorHandler 类中实现 PreHandle 和 PostHandle 来计算实际执行时间时,它以 5 ms 结束。 在java日志中,我可以在业务逻辑已经结束5秒后用Servelet日志检查200OK日志。
有什么方法可以检查同时发生的事情? 网络和内存 CPU 利用率都没有奇点。还没有用户,因为它是一个测试服务器。 但是,这台服务器上运行着大约三个 Spring Boot 应用程序。
我检查了这些东西。
1004 pidstat 1
1005 uptime
1006 dmesg | tail
1008 vmstat 1
1011 mpstat -P ALL 1
1012 iostat -xz 1
1013 free -m
1014 sar -n DEV 1
1019 sar -n TCP,ETCP 1
【问题讨论】:
反应时间长是服务启动后出现的还是随机的?你看过你的应用程序的垃圾收集器吗?我经常使用 Spring Actuators 来监控我的服务的行为。 @seism0saurus 我知道我第一次打开应用程序时很慢,但有时它是随机的。 S0 S1 E O M CCS YGC YGCT FGC FGCT CGC CGCT GCT -0.00 100.00 47.02 30.06 96.86 91.30 18 0.286 0 0.000 6 0.012 0.298
【参考方案1】:
关于 Tomcat/Jetty 之间的性能差异。我可以建议您尝试使用 MockMvc See the get started 进行集成测试
我知道在 OPS 基础架构和 DEV 框架之间拆分测试有多难,但是使用 SpringBoot,您可以通过单元测试来测试和显示执行性能。
您可以随时在您的 API 上重复调用一个,并在执行过程中添加一个 StopWatch。
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class ApplicationTest
private final static Logger LOGGER = LoggerFactory.getLogger(ApplicationTest .class);
@Autowired
private MockMvc mockMvc;
@Test
public void shouldReturnDefaultMessage() throws Exception
StopWatch stopWatch = new StopWatch("Testing REST API performances");
for(int i=1; i<=5; i<++)
stopWatch.start("Test iteration " + i);
this.mockMvc.perform(get("/")).andDo(print()).andExpect(status().isOk())
.andExpect(content().string(containsString("Hello World")));
stopWatch.stop();
// Print the result
LOGGER.info(stopWatch.prettyPrint());
这个测试应该会发现性能问题应该是其余控制器的初始化。
在本地,我在第一次通话时也有延迟。
StopWatch“测试 REST API 性能”:运行时间(毫秒)= 806
00510ms 063 % 测试迭代 1 00072ms 009 % 测试迭代 2 00080ms 010 % 测试迭代 3 00071ms 009 % 测试迭代 4 00073ms 009 % 测试迭代 5 如您所见,第一次调用需要很长时间。
希望我的回答能帮助您达到预期的性能并帮助您做出选择。
【讨论】:
【参考方案2】:传输时间是获取响应的第一个字节所需的时间。
根据这个定义,我倾向于说是你的 API 进行处理的时间 --> 在 API 级别,一些请求可以解释更长的处理时间?算法复杂,处理的数据数量不一样……?
顺便说一下,在第一次调用时,不要忘记创建了 servlet,因此第一个响应可能需要更多时间。
【讨论】:
根据测试代码,实际执行时间在5ms结束。以上是关于Spring Restful API - 有时,响应时间太长的主要内容,如果未能解决你的问题,请参考以下文章
??????spring boot??????restful api