到底什么叫慢食,什么叫“慢”?

到底什么叫慢食,什么叫“慢”?

我有一个正在运行Tomcat 版本 9Docker 容器中的实例AWS EC2 主机
它大部分时间都运行良好,偶尔也会提供资源非常缓慢地

到底什么叫慢食,什么叫“慢”?

我谈论的是两者任何 WAR 之外的纯静态文件但更让人恼火的是,servlet 响应

我见证了一些300 至 400KB提供的资源5 至 12 秒,他们通常(95% 以上的时间)到达~300毫秒


以下是 Chrome 的网络tab 告诉我这些可怕的资源转移:

又一个缓慢的请求
319 KB12.02秒

从 Chrome 的“网络”标签页查看缓慢的请求
278 千字节5.37秒

我不知道这是什么原因造成的。我读了很多帖子,尝试了很多配置,但仍然不明白发生了什么。

从我的 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 AMIt2.micro
  • AWS Linux AMIt2.medium
  • AWS Linux AMIm4.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 &quot;%r&quot; %s %b" />
            </Host>
        </Engine>
    </Service>
</Server>

当然,该<Realm />位将由实际的 JDBC Realm 配置替换。只是指出这一点;无论如何,这不是问题:)

如您所见,我已尝试增加maxThreads所有连接器中的属性,如那个答案。 没有变化。

更多信息

我有一个JMX 东西向我展示 JVM 上到底发生了什么,我用它VisualVM来形象化地展示这一切,但正如你可能从我谈论的方式中猜到的那样,我有近乎不知道我正在看什么。

我的https-jsse-nio2-8443-exec-X线程是唯一在请求到达服务器时似乎在做某事的线程,它们对“慢速”或“正常”的请求漠不关心。但话又说回来,也许我只是没有看到它。

也许您会看到它,所以这里有一个缓慢请求期间:)的屏幕截图:VisualVM

VisualVM 屏幕截图

它只是“停着”(橙色),有时会“运行”(绿色),但只是暂时的,并且它不匹配“慢速”请求或任何其他东西。也许这里实际上没什么可看的。

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

我的实际问题

我可以改变什么来获得一致和合理的传输速率?

相关内容