java - Spring 应用程序在响应请求时显示间歇性延迟

标签 java tomcat networking amazon-ec2 spring-boot

我有一个 Spring 应用程序(使用 SpringBoot 版本 1.3.6.RELEASE)安装在 5 个运行在 Nginx 代理后面的 EC 实例 (m4.4xlarge) 上。所有实例都运行 Ubuntu 14.04。

我使用 java -jar API-0.0.1-SNAPSHOT.jar -Xms8192m -Xmx16384m -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv4Addresses 启动应用程序

当我从其中一个本地实例查询 API 时,为确保该实例已启动并正在运行,在应用程序响应请求之前会显示最多 4 秒的间歇性延迟。请求从本地实例发起到本地实例。

要调用 API,我执行 DATE=$(date +"%Y%m%d%H%M%S");回声$日期; curl -XGET http://xxxx:9998/api/ping --header "Content-Type:application/json" (其中 xxxx 是实例的私有(private) IP 地址)。 api/ping 端点仅返回 pong 值,不涉及数据库或文件系统。

嵌入式 Tomcat 的访问日志也显示了处理请求的延迟。

access log

tcpdump 如下所示,也反射(reflect)了端口上的延迟。

tcpdump

我尝试过的

  • 我正在测试的实例禁用了 TCPv6
  • net.ipv4.tcp_fin_timeout 参数设置为 30
  • 让嵌入式 Tomcat 服务器监听特定地址(不是 *)
  • 尝试扩展 Tomcat 的最小线程数
  • 增加 Tomcat 服务器的超时值

API 在我的本地开发机器上响应一致(当然可以!)

问题是处理请求的间歇性延迟。 API 响应速度在可接受的参数范围内,但间歇性延迟导致 API 响应时间出现大量延迟。

--- 更新 20/9

我设法在我的本地机器上模拟了这个问题。如果应用程序使用 mvn spring-boot:run 运行,调用 API 时不会出现延迟。但是,当使用 java -jar API-0.0.1-SNAPSHOT.jar 启动应用程序时,会出现延迟。

最佳答案

我在维护一个 spring-boot 服务时遇到了这个问题。

我将日志回溯到高延迟开始的那一刻,并将其缩小到我们将 tomcat-embed-jasper 从版本 8.0.26 更新到版本 8.0.36 的那一刻。

我不能确切地告诉你它为什么这样做,但是当我们回滚时,我们的延迟立即消失了。

关于java - Spring 应用程序在响应请求时显示间歇性延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39567648/

相关文章:

c# - 如何在 Windows Phone 上使用 IP 地址解析主机/机器名称

java - 有没有办法在 info 端点上格式化 spring boot 构建信息?

java - SoftLayer SSL VPN 门户 java.lang.NullPointerException @macOS Sierra

java - 无法在我的 Windows 7 机器上运行 Apache Tomcat

tomcat - 如何从主机访问在虚拟机上运行的tomcat实例

java - 应用程序属性 "server.servlet.session.timeout"在 Spring Boot 项目中不起作用

macos - 装有Docker Toolbox的Mac OSX上的Docker中的端口映射

java - Springboot @EntityScan 不工作

tomcat - 找不到 Spring MVC 类

java - 如何减少 ssl 握手的等待时间?