|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
Или 10 или 1 мегабайт я не помню точно. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 18:35 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2, авторнет, идея иметь самое примитивное приложение на переднем крае, в котором нечему ломатся и которое не пропустит вызовы от б24. а вот апп2 тяжелое и может себе позволить не успеать или вовсе упасть. когда поднимется, разгрести очередь из mariadb. Аффтар! Я поражаюсь. Вот вы счас обосновали выбор Message Driven архитектуру. Два раза произнесли слово очередь. А построили два синхронных экзешника друг в друге? Какой у вас сервер очередей? ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 18:44 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2, По постановке тоже интересно. Бизнес логика тяжелая, 2 минуты сохраняет заявку на сантехника. Может не успеть куда? Потом вы сами решили что ему можно упасть? И вы решили что все запросы можно сохранить куда то, чтобы тот жирный сервер поднялся и все разгреб! А юзверю вы на кнопу Создать заявку отписали что создана? Хотя сервер в дауне? Ниче не понятно по юзкейсам. Удачи аффтару! ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 19:06 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
Забавно когда Async-Servlets тоже не помогают ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2020, 20:05 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
открыл для себя утилиту jstack и нашел в чем дело. я несколько бинов пометил SCOPE_PROTOTYPE и случайно на restTemplate тоже бахнул @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) и теперь у меня вопрос, а что же произошло ? судя jstack часть вызовов зависали на блокировке на сутки "http-nio-8081-exec-71" #101 daemon prio=5 os_prio=0 cpu=17.60ms elapsed=83489.77s tid=0x00007f7adc0476c0 nid=0x6028 runnable [0x00007f7ad20dc000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.SocketDispatcher.read0(java.base@15.0.1/Native Method) at sun.nio.ch.SocketDispatcher.read(java.base@15.0.1/SocketDispatcher.java:47) at sun.nio.ch.NioSocketImpl.tryRead(java.base@15.0.1/NioSocketImpl.java:261) at sun.nio.ch.NioSocketImpl.implRead(java.base@15.0.1/NioSocketImpl.java:312) at sun.nio.ch.NioSocketImpl.read(java.base@15.0.1/NioSocketImpl.java:350) at sun.nio.ch.NioSocketImpl$1.read(java.base@15.0.1/NioSocketImpl.java:803) at java.net.Socket$SocketInputStream.read(java.base@15.0.1/Socket.java:981) at java.io.BufferedInputStream.fill(java.base@15.0.1/BufferedInputStream.java:244) at java.io.BufferedInputStream.read1(java.base@15.0.1/BufferedInputStream.java:284) at java.io.BufferedInputStream.read(java.base@15.0.1/BufferedInputStream.java:343) - locked <0x000000008eec03a8> (a java.io.BufferedInputStream) at sun.net.www.http.HttpClient.parseHTTPHeader(java.base@15.0.1/HttpClient.java:754) at sun.net.www.http.HttpClient.parseHTTP(java.base@15.0.1/HttpClient.java:689) at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(java.base@15.0.1/HttpURLConnection.java:1623) - locked <0x000000008eec9e88> (a sun.net.www.protocol.http.HttpURLConnection) at sun.net.www.protocol.http.HttpURLConnection.getInputStream(java.base@15.0.1/HttpURLConnection.java:1528) - locked <0x000000008eec9e88> (a sun.net.www.protocol.http.HttpURLConnection) at java.net.HttpURLConnection.getResponseCode(java.base@15.0.1/HttpURLConnection.java:527) at org.springframework.http.client.SimpleBufferingClientHttpRequest.executeInternal(SimpleBufferingClientHttpRequest.java:82) at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48) at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:66) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:775) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:601) at com.sample.bitrixgw.BitrixRestController.productUpdate(BitrixRestController.java:85) at jdk.internal.reflect.GeneratedMethodAccessor40.invoke(Unknown Source) at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@15.0.1/DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(java.base@15.0.1/Method.java:564) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) я думал в худшем случае получу оверхед на создание нового объекта restTemplate, а тут выглядит что некая очередь образовалась. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 11:35 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
Этот поток в состоянии Runnable, и он ждёт ответа от сервиса. Заблокированы потоки были бы blocked или waiting ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 11:56 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
Возможно имеет смысл подтюнить httpclient, задать размер пула подключений, установить connection timeout и read timeout ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 12:04 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
pavel_nv Этот поток в состоянии Runnable, и он ждёт ответа от сервиса. Заблокированы потоки были бы blocked или waiting да, дальше идут тысячи blocket, не удачный пример взял. но с этим тогда не понятно, elapsed=83489.77s не должен был рест столько ждать. у меня вот так создавался restTemplate: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 12:15 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2 и теперь у меня вопрос, а что же произошло Нужно давать больше цифр. Например, логи где тормозит, по крупному. То есть сколько идёт запрос на app2 и на app1 Сколько требуется по ТЗ и расчётная длительность по нагрузкам. Если 10 одновременных юзверей вешают систему то надо пересмотреть архитектуру. Например не логировать каждый запрос в сессии, а только начало сессии. Или писать в оперативку а не на диск или .... Разобраться нужно ли вам помнить что запрашивалось когда сервер был в дауне на перезагрузке. И кто это будет помнить. Долго вы думаете над обычными вещами по техническому заданию ака ТЗ. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 13:23 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, там 10 юзеров, нет там никакой нагрузки. в целом за день порядка 10-15к вызовов, с пиками до 4 тысячи в отдельные часы. даже у связанных апп1 и апп2 еще запас на увеличение нагрузки в тысячи раз. проблема кажется найдена, присмотревшись к jstack логу увидел, что те что BLOCKED, они все уперлись в synchronized метод. это я подправлю. но у меня остался вопрос по логу с Thread.State: RUNNABLE, почему у restTemplate не отработал ReadTimeout ? я помню, что летом у моего restTemplate был дефолтный timeout и я заметил, что у меня вылетали по timeout попытки записи огромных сделок с сотнями продуктов. потому добавил setReadTimeout(), но похоже вместо timeout получил бесконечное ожидание. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:45 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2, Ну если нет нагрузки то вам решать. Приложение одного окна может в принципе и 500 запросов в сек слать при ОДНОМ переходе на окно Аналитика заказов. Вам виднее. ... Метод синхронизации должен отсутствовать везде. С этого надо начинать топик. Везде убрали? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.12.2020, 18:56 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
хм, а теперь я получил java.util.ConcurrentModificationException at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1631) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:913) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:578) at org.springframework.web.client.RestTemplate$AcceptHeaderRequestCallback.doWithRequest(RestTemplate.java:891) at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:951) at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:773) at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:710) at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:601) at com.sample.webapi.services.OpencartSyncService.processProduct(OpencartSyncService.java:109) at com.sample.webapi.services.OpencartSyncService$$FastClassBySpringCGLIB$$4fe6ea9e.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687) at com.sample.webapi.services.OpencartSyncService$$EnhancerBySpringCGLIB$$fa9863a9.processProduct(<generated>) at com.sample.webapi.services.ProductProcessor.productUpdate(ProductProcessor.java:78) at com.sample.webapi.RestGatewayController$2.run(RestGatewayController.java:125) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) at java.base/java.lang.Thread.run(Thread.java:832) это что, получается restTemplate нифига не thread safe и нужно SCOPE_PROTOTYPE возвращать ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 11:55 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2 хм, а теперь я получил java.util.ConcurrentModificationException at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1631) Тут похоже ты из двух потоков бегаешь итераторами по массиву и без синхронизации его изменяешь. По PROTOTYPE ничего не могу сказать т.к. я пока не вижу связи. И вообще на рубеже 1-й страницы пора уже нам увидеть твои исходники. Т.к. сам понимаешь мы не можем играть в гадалок с хрустальными шарами. Это нудно. И обидно. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 11:58 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
Вот один вариант. Со ссылкой на https://www.codejava.net/java-core/concurrency/java-concurrent-collection-copyonwritearraylist-examples Код: java 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:16 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2, >это что, получается restTemplate нифига не thread safe Ну дак в справке по нему написано - для СИНХРОННОГО доступа. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:18 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
В связи с короной появилось так много желающих засунуть свой код в поток. Казалось бы, что изменилось за последние месяцы? Но многие почему то хотят распарралелить и самому а коде наплодить потоков. Одновременно заявляя выше - "нагрузка у нас небольшая! Штук 10 юзверей)))))) LOL ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:29 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
PetroNotC Sharp hck2, >это что, получается restTemplate нифига не thread safe Ну дак в справке по нему написано - для СИНХРОННОГО доступа. это ж как бэ разное. блокирующий и thread safe. Тут где то callback(requestCallback) хитрый/неявный возможно передается это раз, Два в параметры точно передаются immutable structures? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:33 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
lleming, Ну дак они зависят друг от друга. Если нет потоков то и нет вопроса про thread safe и нет нужды в установке синхронизации. И блокировать ничего не надо. Железная логика? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:41 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
ТЗ 1. Нагрузка небольшая - 10 юзверей 2. Все встает колом... 3. Возможно причина в блокировках. Вопрос - что из трех лишнее в архитектуре (оверхед)? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:46 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
PetroNotC Sharp >это что, получается restTemplate нифига не thread safe Ну дак в справке по нему написано - для СИНХРОННОГО доступа. PetroNotC Sharp lleming, Ну дак они зависят друг от друга. Если нет потоков то и нет вопроса про thread safe и нет нужды в установке синхронизации. И блокировать ничего не надо. Железная логика? Нет. Фраза стояла синхронный клиент имеется ввиду блокирующий поток клиент, при этому он может быть как и thread safe и не thread safe. jdbc стандарт тоже вроде как синхронный по спеке но при этом драйвера плодят поток на каждый коннекшон. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:55 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
mayton Тут похоже ты из двух потоков бегаешь итераторами по массиву и без синхронизации его изменяешь. но стектрейс же уходит глубоко в restTempalte потроха. или я чего-то глобально не понимаю ? mayton По PROTOTYPE ничего не могу сказать т.к. я пока не вижу связи. ну а как остальные используют restTempalte ? врятли же выстраивают в очередь все вызовы рест клиента. по стектрейсу четко видно, что внутри restTemplate что-то ломается при параллельных вызовах. как я понимаю самый адекватный ответ - PROTOTYPE и плодить на каждый вызов отдельный инстанс restTemplate или я совсем неверно рассуждаю ? mayton Т.к. сам понимаешь мы не можем играть в гадалок с хрустальными шарами. Это нудно. И обидно. так там же весь проект тогда надо выставлять, я еще к такому не готов. PetroNotC Sharp hck2, >это что, получается restTemplate нифига не thread safe Ну дак в справке по нему написано - для СИНХРОННОГО доступа. я понял что речь о том что каждый мой поток синхронно ответ получит. PetroNotC Sharp В связи с короной появилось так много желающих засунуть свой код в поток. Казалось бы, что изменилось за последние месяцы? Но многие почему то хотят распарралелить и самому а коде наплодить потоков. Одновременно заявляя выше - "нагрузка у нас небольшая! Штук 10 юзверей)))))) LOL это проект, не основная моя работа и на половину ради того, что бы именно такие вещи для себя прокачать. долбить параллельно это правильно, ставить в очередь во первых не правильно, во вторых я попробовал. тот самый synchronized метод, который существенную часть нагрузки выстроил в очередь и я получил тысячи blocked тредов. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 12:57 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
lleming PetroNotC Sharp >это что, получается restTemplate нифига не thread safe Ну дак в справке по нему написано - для СИНХРОННОГО доступа. PetroNotC Sharp lleming, Ну дак они зависят друг от друга. Если нет потоков то и нет вопроса про thread safe и нет нужды в установке синхронизации. И блокировать ничего не надо. Железная логика? Нет. Фраза стояла синхронный клиент имеется ввиду блокирующий поток клиент, при этому он может быть как и thread safe и не thread safe. jdbc стандарт тоже вроде как синхронный по спеке но при этом драйвера плодят поток на каждый коннекшон. Странный ты. Thread safe это доступ из не кольких потоков. Конечно если блокировать олновременный доступ то и вопрос теряет смысл. Уже пофигу становится, thread on safe или нет))). В jdbc как раз - одно соединение на поток. И все будет нормально. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 13:09 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
hck2 mayton Т.к. сам понимаешь мы не можем играть в гадалок с хрустальными шарами. Это нудно. И обидно. так там же весь проект тогда надо выставлять, я еще к такому не готов. Не надо весь проект. Создай макет который делает тоже самое. 1-2 класса. Кстати это полезно еще тем что ты в процессе уже можешь сам исправить эту ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 13:10 |
|
Tomcat из Spring boot перестает отвечать
|
|||
---|---|---|---|
#18+
>jdbc стандарт тоже вроде как синхронный по спеке но при этом драйвера плодят поток на каждый коннекшон. Он синхронный и не Thread Safe, ПОЭТОМУ приходится плодить! Причина и следствие! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.12.2020, 13:12 |
|
|
start [/forum/topic.php?fid=59&msg=40029244&tid=2120566]: |
0ms |
get settings: |
14ms |
get forum list: |
7ms |
check forum access: |
1ms |
check topic access: |
1ms |
track hit: |
61ms |
get topic data: |
3ms |
get forum data: |
1ms |
get page messages: |
1408ms |
get tp. blocked users: |
0ms |
others: | 305ms |
total: | 1801ms |
0 / 0 |