我有一个正在运行Tomcat 版本 9Docker 容器中的实例AWS EC2 主机。
它大部分时间都运行良好,偶尔也会提供资源非常缓慢地。
到底什么叫慢食,什么叫“慢”?
我谈论的是两者任何 WAR 之外的纯静态文件但更让人恼火的是,servlet 响应。
我见证了一些300 至 400KB提供的资源5 至 12 秒,他们通常(95% 以上的时间)到达~300毫秒。
以下是 Chrome 的网络tab 告诉我这些可怕的资源转移:
我不知道这是什么原因造成的。我读了很多帖子,尝试了很多配置,但仍然不明白发生了什么。
从我的 VPC 内部
正如@Tim建议的那样,我尝试将客户端里面我的 AWS VPC 以排除网络延迟和带宽是导致问题的原因。
在这种设置下,我得到的答案“慢得多”,并且最少内容下载时间~600毫秒有时可能只是200毫秒在“外部世界”。
我仍然注意到对我来说是个问题的缓慢峰值,但它并没有达到最低“正常”下载时间的几十倍,而是只上升到大约2.5秒最多。
响应大小 | 319 KB ------------------------------ 等待 (TTFB) | 99.00 毫秒 内容下载 | 2.81 秒
正如预期的那样,“等待”时间是相同的,因为它代表我的 servlet 在开始响应之前处理请求所花费的时间。
我的环境
我使用以下环境配置复制了该现象:
在 AWS Linux AMI t2.medium 上
- Tomcat 版本 9没有Docker
- 雄猫v9使用 Docker
- 雄猫8.5版使用 Docker
- 雄猫8.0版使用 Docker
Tomcat v9 与 Docker 配合使用:
- AWS Linux AMI
t2.micro
- AWS Linux AMI
t2.medium
- AWS Linux AMI
m4.xlarge
通过 ECS 在 AWS Linux AMI t2.medium 上
- Tomcat v9 与 Docker
这些测试中至少有一半可能是愚蠢的,但是……信息太多总比太少好。
我认为我可以排除的是:
- 我的实例太小(失败
m4.xlarge
) - Tomcat 的新版本以某种方式处理不同的事情
- Docker 容器的开销让事情变得一团糟
我的 Tomcat 配置
好吧,它一定是从那里来的,对吧?所以,它在这里:
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<Service name="Catalina">
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" maxThreads="1500" />
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" maxThreads="1500" />
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Nio2Protocol" sslImplementationName="org.apache.tomcat.util.net.jsse.JSSEImplementation" maxThreads="1500" SSLEnabled="true"
scheme="https" secure="true" keystoreFile="/root/ssl/XXXXXXXX.jks" keystorePass="XXXXXXXX" clientAuth="false" sslProtocol="TLS" compression="on" compressionMinSize="1024"
compressableMimeType="application/json" />
<Engine name="Catalina" defaultHost="localhost">
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm />
</Realm>
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log." suffix=".txt" pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
当然,该<Realm />
位将由实际的 JDBC Realm 配置替换。只是指出这一点;无论如何,这不是问题:)
。
如您所见,我已尝试增加maxThreads
所有连接器中的属性,如那个答案。 没有变化。
更多信息
我有一个JMX 东西向我展示 JVM 上到底发生了什么,我用它VisualVM
来形象化地展示这一切,但正如你可能从我谈论的方式中猜到的那样,我有近乎不知道我正在看什么。
我的https-jsse-nio2-8443-exec-X
线程是唯一在请求到达服务器时似乎在做某事的线程,它们对“慢速”或“正常”的请求漠不关心。但话又说回来,也许我只是没有看到它。
也许您会看到它,所以这里有一个缓慢请求期间:)
的屏幕截图:VisualVM
它只是“停着”(橙色),有时会“运行”(绿色),但只是暂时的,并且它不匹配“慢速”请求或任何其他东西。也许这里实际上没什么可看的。
我可以为您提供线程转储和您需要的一切!
我的实际问题
我可以改变什么来获得一致和合理的传输速率?