【问题标题】:Spring Restful API - Sometimes, response time is too longSpring Restful API - 有时,响应时间太长
【发布时间】: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

标签: java spring spring-boot servlets tomcat8


【解决方案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结束。
    猜你喜欢
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2017-05-02
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多