我在AWS EC2主机上的Docker容器中运行了Tomcat v9实例。
它在大多数情况下都是完美的,并且会在一段时间内非常缓慢地提供资源。
我正在讨论任何WAR之外的纯静态文件 ,而且更令人讨厌的是, servlet响应 。
我目睹了5到12个 服务器的大约300到400KB的资源,他们通常(95%的时间)在〜300ms内到达。
以下是Chrome的“ networking”标签告诉我有关这些不良资源传输的示例:
31.02KB在12.02s
在5.37s中为278KB
我不知道是什么原因造成的。 我已经读了很multithreading,并尝试了很多configuration,但仍然不明白是怎么回事。
正如@Tim所build议的那样,我试图将客户端放入我的AWS VPC中,以排除networking延迟和带宽问题。
在这个设置中,我得到的答案“慢得多”,最less600毫秒的 内容下载时间,在“外部世界”有时只有200 毫秒 。
我仍然注意到对我来说是一个缓慢的高峰,但是最less的“正常”下载时间不过是几十倍,而最多只能达到2.5s左右。
响应大小| 319 KB ------------------------------ 等待(TTFB)| 99.00毫秒 内容下载| 2.81秒
“等待”时间与预期相同,因为它表示我的servlet在开始响应之前处理请求的时间。
我用以下环境configuration复制了这种现象:
t2.micro
t2.medium
m4.xlarge
这些testing中至less有一半可能是愚蠢的,但是…更好的信息比太less。
我想我可以排除这些之后是:
m4.xlarge
失败) 好吧,它必须从那里来,对不对? 所以,这里是:
<?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 Realmconfiguration取代。 只是指出来; 这不是问题:)
。
正如你所看到的,我已经尝试在所有的连接器中增加maxThreads
属性,就像那个答案中的特征一样 。 没有变化。
我有一个JMX显示了我的JVM到底发生了什么,我使用VisualVM
将其全部可视化,正如你可以猜测我是怎么谈论它的,我几乎不知道我在看什么。
我的https-jsse-nio2-8443-exec-X
线程是唯一一个在请求到达服务器时做某些事情的线程,对“慢”或“正常”请求只是无动于衷。 但是再一次,也许我只是没有看到它。
也许你会看到,虽然:)
,所以这是一个缓慢的请求期间VisualVM
的屏幕截图:
这只是“停放”(橙色),有时会“跑”(绿色),但只是暂时的,它不符合“慢”的要求或任何东西。 也许这里实际上没有什么可看的。
我可以改变什么来保持一致和合理的转移率?