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与单元测试

Spring Boot构建RESTful API

基于Spring-WS的Restful API的集成测试

??????spring boot??????restful api

Spring Boot整合Swagger2构建RESTful API

Spring Boot - Restful API