Я бегу Tomcat v9 экземпляр в контейнере Docker на Хост AWS EC2.
Он работает отлично большую часть времени и время от времени доставляет ресурсы очень медленно.
Я говорю о обоих простые статические файлы вне любой WAR но также - и что еще более досадно, ответы сервлета.
Я свидетель некоторых От 300 до 400 КБ ресурсы обслуживаются в 5–12 с, куда они обычно (95% + времени) прибывают в ~ 300 мс.
Вот пример того, что Chrome Сеть Вкладка рассказывает мне об этих мрачных передачах ресурсов:
319 КБ в 12.02 с
278 КБ в 5,37 с
Понятия не имею, чем это вызвано. Я прочитал много тем и перепробовал множество конфигураций, но до сих пор не могу понять, что происходит.
Как предложил @Tim, я попытался поставить клиента внутри мой AWS VPC, чтобы исключить задержку сети и пропускную способность как причину проблемы.
В этой настройке я получаю ответы "намного медленнее", с минимальным Загрузка контента время ~ 600 мс где это могло быть только иногда 200 мс во «внешнем мире».
Я все еще замечаю медленные пики, которые являются для меня проблемой, но вместо того, чтобы увеличивать в десятки раз минимальную, «нормальную» продолжительность загрузки, она увеличивается примерно до 2,5 с в большинстве.
Response size | 319 KB ------------------------------ Waiting (TTFB) | 99.00 ms Content Download | 2.81 s
Время «ожидания» такое же, как и ожидалось, поскольку оно представляет время, затраченное моим сервлетом на обработку запроса, прежде чем он начнет отвечать.
Я воспроизвел этот феномен в следующих конфигурациях среды:
t2.micro
t2.medium
m4.xlarge
По крайней мере, половина из этих тестов, вероятно, глупа, но что ж ... лучше слишком много информации, чем слишком мало.
Я думаю, что могу исключить после этого:
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 />
bit, конечно же, должен быть заменен реальной конфигурацией области JDBC. Просто указываю на это; в любом случае это не проблема :)
.
Как видите, я попытался увеличить maxThreads
атрибут во всех моих соединителях, как показано в этот ответ. Без изменений.
у меня есть JMX штуковина показывая мне, что именно происходит на моей JVM, я использую VisualVM
чтобы визуализировать все это, но, как вы, наверное, догадались по тому, как я говорю об этом, у меня почти без понятия на что я смотрю.
Мой https-jsse-nio2-8443-exec-X
потоки, которые являются единственными, которые, кажется, что-то делают, когда запрос попадает на сервер, просто безразличны к «медленным» или «нормальным» запросам. Но опять же, может, я просто этого не вижу.
Может, ты это увидишь :)
, вот скриншот VisualVM
во время медленного запроса:
Он просто «припаркован» (оранжевый цвет) и иногда «запускается» (зеленый), но только на мгновение и не соответствует «медленным» запросам или чему-то еще. Может быть, здесь вообще нечего смотреть.
Что я могу изменить, чтобы разумный Скорость передачи?