【发布时间】: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