【问题标题】:Spring application showing intermittent delays in responding to requestsSpring 应用程序在响应请求时显示间歇性延迟
【发布时间】:2017-01-26 19:36:53
【问题描述】:

我在 Nginx 代理后面运行的 5 个 EC 实例 (m4.4xlarge) 上安装了一个 Spring 应用程序(使用 SpringBoot 版本 1.3.6.RELEASE)。所有实例都运行 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"); echo $DATE; curl -XGET http://xxxx:9998/api/ping --header "Content-Type:application/json"(其中 xxxx 是实例的私有 IP 地址)。 api/ping 端点只返回 pong 值,不涉及数据库或文件系统。

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

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 启动应用程序时,会看到延迟。

【问题讨论】:

    标签: java tomcat networking amazon-ec2 spring-boot


    【解决方案1】:

    最近的 Tomcat 改变了在RemoteIpValve 中获取hostname 信息的方式。这会导致每个请求的长时间延迟。调整 /etc/hosts 可能会有所帮助,我决定改用 Undertow。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢,我去看看。我们最终在独立的 tomcat 安装中安装了 spring-boot 应用程序
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多