我在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如下所示,它也反映了端口的延迟。
我尝试了什么
API在我的本地开发机器上一致响应(当然它确实如此!)
问题是处理请求的间歇性延迟。 API响应的速度在可接受的参数范围内,但间歇性延迟导致API响应时间大幅延迟。
--- 更新20/9
我设法在我的本地计算机上模拟了这个问题。如果使用mvn spring-boot:run
运行应用程序,则在调用API时不会出现延迟。但是,当使用java -jar API-0.0.1-SNAPSHOT.jar
启动应用程序时,会看到延迟。
答案 0 :(得分:0)
我使用我维护的spring-boot服务遇到了这个问题。
我将我们的日志读回到高延迟开始的程度,并将其缩小到我们将tomcat-embed-jasper
从版本8.0.26更新到版本8.0.36的那一刻。
我无法确切地告诉你为什么会这样做,但当我们回滚时,我们的延误立即消失。
答案 1 :(得分:0)
最近的Tomcat更改了在hostname
中获取RemoteIpValve
信息的方式。这导致每个请求的长时间延迟。调整/etc/hosts
可能会有所帮助,我决定改用Undertow。