使用AWS EC2上的Tomcat,偶尔极其缓慢的资源传输

我在AWS EC2主机上的Docker容器中运行了Tomcat v9实例。
它在大多数情况下都是完美的,并且会在一段时间内非常缓慢地提供资源。

什么是缓慢服务,什么是“慢”?

我正在讨论任何WAR之外的纯静态文件 ,而且更令人讨厌的是, servlet响应

我目睹了5到12个 服务器的大约300到400KB的资源,他们通常(95%的时间)在〜300ms内到达。


以下是Chrome的“ networking”标签告诉我有关这些不良资源传输的示例:

另一个缓慢的要求
31.02KB12.02s

从Chrome的“网络”标签中查看缓慢的请求
5.37s中为278KB

我不知道是什么原因造成的。 我已经读了很multithreading,并尝试了很多configuration,但仍然不明白是怎么回事。

从我的VPC

正如@Tim所build议的那样,我试图将客户端放入我的AWS VPC中,以排除networking延迟和带宽问题。

在这个设置中,我得到的答案“慢得多”,最less600毫秒的 内容下载时间,在“外部世界”有时只有200 毫秒
我仍然注意到对我来说是一个缓慢的高峰,但是最less的“正常”下载时间不过是几十倍,而最多只能达到2.5s左右。

响应大小|  319 KB
 ------------------------------
等待(TTFB)|  99.00毫秒
内容下载|  2.81秒

“等待”时间与预期相同,因为它表示我的servlet在开始响应之前处理请求的时间。

我的环境(S)

我用以下环境configuration复制了这种现象:

在AWS Linux AMI t2.medium上

  • Tomcat v9 不带 Docker
  • Tomcat v9 w / Docker
  • Tomcat v8.5 w / Docker
  • Tomcat v8.0 w / Docker

Tomcat v9 w / Docker:

  • AWS linux AMI t2.micro
  • AWS linux AMI t2.medium
  • AWS linux AMI m4.xlarge

在AWS Linux AMI t2.medium上通过ECS

  • Tomcat v9 w / Docker

这些testing中至less有一半可能是愚蠢的,但是…更好的信息比太less。

我想我可以排除这些之后是:

  • 我的实例太小(与m4.xlarge失败)
  • Tomcat的新版本以某种方式处理不同的事情
  • docker集装箱的开销搞乱了事情

我的Tomcatconfiguration

好吧,它必须从那里来,对不对? 所以,这里是:

 <?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 &quot;%r&quot; %s %b" /> </Host> </Engine> </Service> </Server> 

当然, <Realm />位被实际的JDBC Realmconfiguration取代。 只是指出来; 这不是问题:)

正如你所看到的,我已经尝试在所有的连接器中增加maxThreads属性,就像那个答案中的特征一样 。 没有变化。

更多信息

我有一个JMX显示了我的JVM到底发生了什么,我使用VisualVM将其全部可视化,正如你可以猜测我是怎么谈论它的,我几乎不知道我在看什么。

我的https-jsse-nio2-8443-exec-X线程是唯一一个在请求到达服务器时做某些事情的线程,对“慢”或“正常”请求只是无动于衷。 但是再一次,也许我只是没有看到它。

也许你会看到,虽然:) ,所以这是一个缓慢的请求期间VisualVM的屏幕截图:

VisualVM截图

这只是“停放”(橙色),有时会“跑”(绿色),但只是暂时的,它不符合“慢”的要求或任何东西。 也许这里实际上没有什么可看的。

我可以为您提供线程转储和您需要的一切!

我的实际问题

我可以改变什么来保持一致和合理的转移率?