Назад | Перейти на главную страницу

Время от времени мучительно медленная передача ресурсов с Tomcat на AWS EC2

Я бегу Tomcat v9 экземпляр в контейнере Docker на Хост AWS EC2.
Он работает отлично большую часть времени и время от времени доставляет ресурсы очень медленно.

Что именно подается медленно, а что «медленно»?

Я говорю о обоих простые статические файлы вне любой WAR но также - и что еще более досадно, ответы сервлета.

Я свидетель некоторых От 300 до 400 КБ ресурсы обслуживаются в 5–12 с, куда они обычно (95% + времени) прибывают в ~ 300 мс.


Вот пример того, что Chrome Сеть Вкладка рассказывает мне об этих мрачных передачах ресурсов:


319 КБ в 12.02 с


278 КБ в 5,37 с

Понятия не имею, чем это вызвано. Я прочитал много тем и перепробовал множество конфигураций, но до сих пор не могу понять, что происходит.

Из моего VPC

Как предложил @Tim, я попытался поставить клиента внутри мой AWS VPC, чтобы исключить задержку сети и пропускную способность как причину проблемы.

В этой настройке я получаю ответы "намного медленнее", с минимальным Загрузка контента время ~ 600 мс где это могло быть только иногда 200 мс во «внешнем мире».
Я все еще замечаю медленные пики, которые являются для меня проблемой, но вместо того, чтобы увеличивать в десятки раз минимальную, «нормальную» продолжительность загрузки, она увеличивается примерно до 2,5 с в большинстве.

Response size       | 319 KB
------------------------------
Waiting (TTFB)      | ​99.00 ms
Content Download    | 2.81 s

Время «ожидания» такое же, как и ожидалось, поскольку оно представляет время, затраченное моим сервлетом на обработку запроса, прежде чем он начнет отвечать.

Мое окружение

Я воспроизвел этот феномен в следующих конфигурациях среды:

На AWS linux AMI t2.medium

Tomcat v9 с Docker на:

На AWS linux AMI t2.medium через ECS


По крайней мере, половина из этих тестов, вероятно, глупа, но что ж ... лучше слишком много информации, чем слишком мало.

Я думаю, что могу исключить после этого:

Моя конфигурация 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 /> bit, конечно же, должен быть заменен реальной конфигурацией области JDBC. Просто указываю на это; в любом случае это не проблема :).

Как видите, я попытался увеличить maxThreads атрибут во всех моих соединителях, как показано в этот ответ. Без изменений.

Больше информации

у меня есть JMX штуковина показывая мне, что именно происходит на моей JVM, я использую VisualVM чтобы визуализировать все это, но, как вы, наверное, догадались по тому, как я говорю об этом, у меня почти без понятия на что я смотрю.

Мой https-jsse-nio2-8443-exec-X потоки, которые являются единственными, которые, кажется, что-то делают, когда запрос попадает на сервер, просто безразличны к «медленным» или «нормальным» запросам. Но опять же, может, я просто этого не вижу.

Может, ты это увидишь :), вот скриншот VisualVM во время медленного запроса:

Он просто «припаркован» (оранжевый цвет) и иногда «запускается» (зеленый), но только на мгновение и не соответствует «медленным» запросам или чему-то еще. Может быть, здесь вообще нечего смотреть.

Я могу предоставить вам дампы потоков и все необходимое!

Мой актуальный вопрос

Что я могу изменить, чтобы разумный Скорость передачи?