我有一个 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 的访问日志也显示了处理请求的延迟。
tcpdump 如下所示,也反射(reflect)了端口上的延迟。
我尝试过的
- 我正在测试的实例禁用了 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/