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

时间:2016-09-19 07:32:46

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

我在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的访问日志也显示处理请求的延迟。

access log

tcpdump如下所示,它也反映了端口的延迟。

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

2 个答案:

答案 0 :(得分:0)

我使用我维护的spring-boot服务遇到了这个问题。

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

我无法确切地告诉你为什么会这样做,但当我们回滚时,我们的延误立即消失。

答案 1 :(得分:0)

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