|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
Андрей Панфиловquestionerнагрузку не снимается, сервер имеет возможность лучше обрабатывать пиковые нагрузки.Физика под этим "лучше обрабатывать" какая лежит? Вот мы берем "типичное" приложение и затаскиваем весь говнокод из контроллеров в DefferedResult - в каком месте и из-за чего оно начнет что-то "лучше обрабатывать"? или таки есть специфичные кейсы где мы можем получить неиллюзорный профит а в остальных случаях ничего кроме геморроя не получить? Вы вообще задумывались по какой причине топят за всякие фиберы в жаве и реактивное программирование? почему поток - это плохо? Если резюмировать то о чем мы общались, то я согласен, с тем, что чуть экономнее по памяти будет настраивать контейнер для тех случаев, которые мы рассматривали. Но если контейнер не настраивается или хочется большего контроля над тредпулом, то можно использовать servlet 3.0 и результаты будут сходные. Небольшой(в большинстве случаев) оверхед по памяти. Андрей Панфилов профит появляется только тогда, когда мы умеем обрабатывать отложенные запросы пачками А вот тут Вы правильно заметили, но не развили мысль, а я уже забыл про это хотя пару лет назад читал. https://www.javacodegeeks.com/2013/10/how-to-use-asynchronous-servlets-to-improve-performance.html а лучше тут(в предыдущей ссылке не очень понятно как событие вызывается) https://plumbr.io/blog/java/how-to-use-asynchronous-servlets-to-improve-performance В общем суть в том, что есть 100500 клиентов которые ждут например какой-то котировки, которая обновляется раз в 5 секунд и соответственно для клиента это ОК ждать какое-то время. Соответственно мы должны просто принять запрос и положить его в очередь. Когда пришло событие с новой котировкой мы просто забираем из очереди все запросы и отправляем клиентам эту котировку. Throughput взлетел до небес, Latency тоже радует. Андрей Панфилов , Теперь насчёт 3.0 мы одной волне? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 12:56 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
сладкий бубалехпочему нет смысла? а как на счет того, что поток это жирно для ОС(процесс для ОС еще жирнее, к примеру) и мы можем переложить выполнение некоторых задач(чтение-запись файла) на потоки ядра, которые еще сильнее оптимизированы и тоньше. nginx работающий по такому принципу, значительно производительнее apache, который создает потоки для каждого подключенияПотому что чтобы получить профит должен быть определенный паттерн работы сервиса, ну например как в сеансе одновременной игры в шахматы: гроссмейстер может одновременно с несколькими нубами играть, просто потому что может, а одновременно с такими же по уровню - кишка тонка. Здесь то же самое: тыще клиентов отправить один и тот же ответ с некоторой приемлемой задержкой - прекрасно перекладывается на асинхронную обработку, а посчитать классический Фибоначчи - профита не будет никакого. Хотим с СУБД как-то хитро работать? нет проблем, только нужно будет забыть про консистентность. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 13:04 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
Андрей ПанфиловЧтобы получить профит должен быть определенный паттерн работы сервиса Прям резюмировал топик +5. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 13:33 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
PetroNotC SharpquestionerНу вот ещё(автор если что ROSSEN STOYANCHEV): вы у автора уточните. Он беспокоится за оптимизацию бэка или клиента? У клиента при асинхронном программировании методом AJAX и так всё шеколадно. Он ждёт Асинхронно ответ (в разумных пределах таймаута) и его ничего не парит. Ему не нужно сразу возвращать управление(ответ). Поэтому забудьте о клиенте при доказательствах нужности. Всё таки умение увидеть в тексте абсолютно противоположное это искусство. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 13:38 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner А вот тут Вы правильно заметили, но не развили мысль, а я уже забыл про это хотя пару лет назад читал. https://www.javacodegeeks.com/2013/10/how-to-use-asynchronous-servlets-to-improve-performance.html а лучше тут(в предыдущей ссылке не очень понятно как событие вызывается) https://plumbr.io/blog/java/how-to-use-asynchronous-servlets-to-improve-performance В общем суть в том, что есть 100500 клиентов которые ждут например какой-то котировки, которая обновляется раз в 5 секунд и соответственно для клиента это ОК ждать какое-то время. Соответственно мы должны просто принять запрос и положить его в очередь. Когда пришло событие с новой котировкой мы просто забираем из очереди все запросы и отправляем клиентам эту котировку. Throughput взлетел до небес, Latency тоже радует. Андрей Панфилов , Теперь насчёт 3.0 мы одной волне? highload и low latency проекты могут пересекать, но в данном случае - latency вряд ли будет радовать, но пропускная способность - да. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 13:48 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questionerСуть использования асинхронных сервлетов в том, что мы можем вернуть DefferedResult(Если работать через spring). Это приводит к тому, что тред томката освобождается после того как мы передали управление в контроллер(если код правильно написать) освобождается и сразу становится свободным для принятия новых запросов. Далее контроллер вызывает сервис, базу в отдельном треде и как только у нас есть ответ, то мы говорим, что досчитали defferedResult и работа передаётся в тред томката. Есть какой-то новый reactive spring webflux https://stackoverflow.com/questions/46606246/spring-mvc-async-vs-spring-webflux/46621923 Я что-то не могу понять в чём принципиальное отличие. 1. когда родились так называемые асинхронные сервлеты 3.0 - запросо то там были асинхронными, но io все еще было стандартным - блокирующим. В 3.1 исправили, но webflux стал рождаться раньше. 2. webflux добавил сахаара из стримов 3. все таки надо понимать, что spring стал работать одноврменно над reactive репозиториями, без которых освобождение потока - такое себе счастье. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:01 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
ОзверинquestionerА вот тут Вы правильно заметили, но не развили мысль, а я уже забыл про это хотя пару лет назад читал. https://www.javacodegeeks.com/2013/10/how-to-use-asynchronous-servlets-to-improve-performance.html а лучше тут(в предыдущей ссылке не очень понятно как событие вызывается) https://plumbr.io/blog/java/how-to-use-asynchronous-servlets-to-improve-performance В общем суть в том, что есть 100500 клиентов которые ждут например какой-то котировки, которая обновляется раз в 5 секунд и соответственно для клиента это ОК ждать какое-то время. Соответственно мы должны просто принять запрос и положить его в очередь. Когда пришло событие с новой котировкой мы просто забираем из очереди все запросы и отправляем клиентам эту котировку. Throughput взлетел до небес, Latency тоже радует. Андрей Панфилов , Теперь насчёт 3.0 мы одной волне? highload и low latency проекты могут пересекать, но в данном случае - latency вряд ли будет радовать, но пропускная способность - да. Согласен, что на throughput оптимизация выглядит более очевидной, но у автора статьи и latency выросла тоже не кисло. https://plumbr.io/blog/java/how-to-use-asynchronous-servlets-to-improve-performance This bit of code is a little more complex, so maybe before we start digging into solution details, I can outline that this solution performed ~5x better latency - and ~5x better throughput-wise Но это конкретный пример, надо это понимать. Итого мы разобрались с поддержкой async в servlet 3.0 Давайте теперь с 3.1 Я понимаю, что 3.0 использует блокирующее IO и если у нас плохая сеть, большие запросы/ответы или медленный клиент, то тред контейнера может надолго захватиться и все наши усилия пойдут лесом. Servlet 3.1 использует NIO, что позволяет побороть данную проблему. Теперь вернёмся к WebFlux: https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server-application Remember the same application code runs on Tomcat, Jetty or Netty. Currently, the Tomcat and Jetty support is provided on top of Servlet 3.1 asynchronous processing, so it is limited to one request per thread. When the same code runs on the Netty server platform that constraint is lifted, and the server can dispatch requests sympathetically to the web client. As long as the client doesn’t block, everyone is happy. Performance metrics for the netty server and client probably show similar characteristics, but the Netty server is not restricted to processing a single request per thread , so it doesn’t use a large thread pool and we might expect to see some differences in resource utilization. We will come back to that later in another article in this series. Ну то есть servlet 3.1 и webFlux для томката это по сути одно и то же. Я вот не могу понять смысла выделенной фразы. Что он имеет ввиду? в случае асинхронных сервлетов мы ведь уже принимаем запрос одним потоком, а возвращаем другим(скорее всего) Следующей статьи я не нашёл) Видимо он её так и не написал ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:11 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner, Ты не огрызайся, а думай. У тебя не первый топик с шиворот навыворот выводами. Пиши код вместе с рассуждениями. Про DI инверсию код написал? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:12 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
Озверин3. все таки надо понимать, что spring стал работать одноврменно над reactive репозиториями, без которых освобождение потока - такое себе счастье. а кто там уже есть? в 2016 году на момент написания статьи: https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server-application Very few databases support non-blocking clients at this point in time (MongoDB and Couchbase are notable exceptions, but even those are not as mature as the HTTP clients) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:16 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
PetroNotC Sharpquestioner, Ты не огрызайся, а думай. У тебя не первый топик с шиворот навыворот выводами. Пиши код вместе с рассуждениями. Про DI инверсию код написал? У тебя всё хорошо? я за тебя переживаю. Все люди как люди, вносят вклад в топик, а ты ничего не понимаешь, а чего-то всё строчишь. ЧСВ повышаешь? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:18 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questionerВ общем суть в том, что есть 100500 клиентов которые ждут например какой-то котировки, которая обновляется раз в 5 секунд и соответственно для клиента это ОК ждать какое-то время. Соответственно мы должны просто принять запрос и положить его в очередь. Когда пришло событие с новой котировкой мы просто забираем из очереди все запросы и отправляем клиентам эту котировку. Throughput взлетел до небес, Latency тоже радует. Вы пытаетесь натянуть сову на глобус: чтобы отдать клиентам один и тот же ответ не нужно их ставить в очередь и обрабатывать запросы по два раза, достаточно результат в памяти разместить (или html под nginx положить и кроном обновлять ) и производительность будет заоблачной. questionerТеперь насчёт 3.0 мы одной волне?Определенно нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:18 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
https://spring.io/blog/2018/12/07/reactive-programming-and-relational-databases As of now, there are three driver implementations: PostgreSQL H2 Microsoft SQL Server ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:20 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
Андрей ПанфиловquestionerВ общем суть в том, что есть 100500 клиентов которые ждут например какой-то котировки, которая обновляется раз в 5 секунд и соответственно для клиента это ОК ждать какое-то время. Соответственно мы должны просто принять запрос и положить его в очередь. Когда пришло событие с новой котировкой мы просто забираем из очереди все запросы и отправляем клиентам эту котировку. Throughput взлетел до небес, Latency тоже радует. Вы пытаетесь натянуть сову на глобус: чтобы отдать клиентам один и тот же ответ не нужно их ставить в очередь и обрабатывать запросы по два раза, достаточно результат в памяти разместить (или html под nginx положить и кроном обновлять ) и производительность будет заоблачной. 1. Где у меня по 2 раза обработка запроса? 2. Зависит от того чего хотим добиться. Если нужно отдавать старую котировку, то можно старую отдавать. Если хотят самую свежую, то придётся повисеть и подождать. Да и вообще, чтобы отдавать старую котировку асинхронные сервлеты вообще не нужны) По Вашему то какой для 3.0 сервлетов юзкейс ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:28 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner, И где в топике прошлом по DI ты что нибудь понял? Вот поэтому ты и флудишь мне) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:39 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
PetroNotC Sharpquestioner, И где в топике прошлом по DI ты что нибудь понял? Вот поэтому ты и флудишь мне) Все, я больше умственно отсталым не отвечаю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 14:56 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
redwhite90, наконец то тебе дошло и больше флудить без аргументов не будем. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 15:25 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner, если смотреть на всю архитектуру запросов и что изменилось: 1. В версии http 1.0 каждый запрос порождал соединение. Запрос - соединение создается - ответ - соединение закрывается 1.2. Один запрос - один поток. Причем это дорогой поток, потому что является блокироующим: и поток, и ресурсы(база, файл, io). Тут кроется проблема - скорость! http 1. 0 медленный из-за того, что на каждый запрос приходится открывать и закрывать соединение 2. В версии http 1.1 в рамках одного соединения может быть несколько запросов, каждый из которых будет в своем отдельном потоке. Скорость увеличивается для клиентов, которые посылают запросы пачками, но, возникает проблема, что web container быстро расходует pool потоков. Для чего вообще пул потоков существует? Само собой для latency - создание потока - дорогая операция(и по скорости, и по памяти). Потому web server`ы на старте создают пул потоков и используют потоки для request`ов из него. Идем дальше, если у нас появилось большое кол-во потоков, то нам надо как-то сделать так, чтобы эти потоки были "короткими", т.е. чтобы они быстро возвращались в pool. Вот тут вступает асинхронность версии 3.0. Мы передаем запрос в новый поток, а в текущем потоке возвращаем "ссылку" на поток и текущий поток возвращаем в pool. В чем плюс? В том, что мы возвращаем ссылку на поток из другого пула, либо вообще на новый поток, таким образом не расходуя пул потоков веб сервера. Тут на сцену выходит блоикровка ресурсов. Не смотря на то, что мы пытаемся вернуть ответ асинхронно, все равно некоторые операции могут "держать" поток запроса. Например, чо нить мы заливаем на сервак долгое. Что делать? Да тоже самое, но немного в другом ключе: 1. Сказать, хочу асинхронной работы 2. Дождаться когда контекст вернет новый поток, в котором будут средства для неблокирующего чтения ваших данных 3. В этом потоке уже заливать данные 4. Поток запроса отпустить. Как-то так я себе все это представляю. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:06 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server-application Remember the same application code runs on Tomcat, Jetty or Netty. Currently, the Tomcat and Jetty support is provided on top of Servlet 3.1 asynchronous processing, so it is limited to one request per thread. When the same code runs on the Netty server platform that constraint is lifted, and the server can dispatch requests sympathetically to the web client. As long as the client doesn’t block, everyone is happy. Performance metrics for the netty server and client probably show similar characteristics, but the Netty server is not restricted to processing a single request per thread, so it doesn’t use a large thread pool and we might expect to see some differences in resource utilization. We will come back to that later in another article in this series. Я вот не могу понять смысла выделенной фразы. Что он имеет ввиду? в случае асинхронных сервлетов мы ведь уже принимаем запрос одним потоком, а возвращаем другим(скорее всего) Следующей статьи я не нашёл) Видимо он её так и не написал Вот кстати с автором статьи связался и он исправил на https://spring.io/blog/2016/07/20/notes-on-reactive-programming-part-iii-a-simple-http-server-application Remember the same application code runs on Tomcat, Jetty or Netty. Currently, the Tomcat and Jetty support is provided on top of Servlet 3.1 asynchronous processing, so it is no longer limited to one request per thread. It is build on top of a Reactive bridge that adapts the Servlet 3.1 concepts to the reactive paradigm. In the case of Reactor Netty, the backpressure and reactive support is built-in. Depending on your choice of HTTP client library, server and client might share the same HTTP resources and optimize things even more. We will come back to that later in another article in this series. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:18 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
questioner, теперь к webflux. Скажем так, в основе его лежит СОВЕРШЕНО другая парадигма, тем не менее, которая решает похожие задчи. В основе лежат reactive streams - асинхроннные потоки которые можно СЛУШАТЬ. По сути - это event driven архитектура с продюсерами и подписчиками. Я думаю, не надо тут глубок расписывать плюсы от подобной архитектуры - итак понятно. В java8 никаких реактив стримов не было, была собственная имплементация от нетфликса - rxjava(вроде, если не ошибаюсь). Ее то и использовали поцоны из спринга. В java9 уже была rxjava2 вроде как, короче, реактив стримы стали ядром системы. И насчет потоков и разницы между tomcat и netty. Tomcat - стандартный веб контейнер, который имплементирует текущую реализацию http 1.1 с переиспользованием одного соединения для нескольких запросов, КАЖДЫЙ ИЗ КОТОРЫХ порождает один поток. Тогда как Netty - ну это в первую очреедь некий event driven инструмент, из которого МОЖНО сделать web сервер, у которого правда будет совершенно другая начинка, нежели чем у Tomcat`а. Но тут я честно сказать netty не использовал особо, потому ...не сварщик. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:20 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
Жаль тут парень какой-то black чего-то там не пишет больше. И форум в руках ...короче не у кого даже спросить, чтобы поправили. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:23 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
ОзверинСОВЕРШЕНО другая парадигма+1 Реактивная. Причем эта парадигма не подменяет и не улучшает rest. Она просто идет рядом и не факт что не сгинет через пару лет. Можно пробовать, но переписывать классику на "это" не стоит. Мои сожаления автору топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:33 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
ОзверинМОЖНО сделать web сервер Угу. Типа HttpServer .create("localhost", 8080) .newHandler(new ReactorHttpHandlerAdapter(httpHandler)) .block(); ... MS счас этим балуется со своим kestrel. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:40 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
ОзверинТут кроется проблема - скорость! http 1. 0 медленный из-за того, что на каждый запрос приходится открывать и закрывать соединениеНе совсем так, насколько я помню, разницы между включенным и выключенным keepalive нет, если не используется SSL/TLS, вот рукопожатие TLS действительно дорогое и без keepalive никуда, в тоже время всякие forward-proxy и терминаторы TLS к бэкенду как раз без keepalive ходят (не уверен как сейчас, но когда я этими вещами занимался года до 2008 все так и было) ОзверинДля чего вообще пул потоков существует? Само собой для latency - создание потока - дорогая операция(и по скорости, и по памяти). Потому web server`ы на старте создают пул потоков и используют потоки для request`ов из него.дорого - понятие относительное, относительно создания объекта или сложения 1+1, да, дорого, а в сравнении со "сходить в базу", уже и не дорого Основная проблема тут больше в том, что "глупый" планировщик ОС ничего о приложении не знает и наивно выдает кванты времени потокам, которым выполнение в данный момент не нужно ну и про между прочим контексты переключает и пр, вообщем performance penalty здесь очевидный, и пулы потоков используют больше не потому что дорого создавать, а потому что это довольно простой способ ограничить число экзекьюшн юнитов сверху. ОзверинВ чем плюс? В том, что мы возвращаем ссылку на поток из другого пула, либо вообще на новый поток, таким образом не расходуя пул потоков веб сервера.Ну вы рассказали что происходит, а в чем же плюс рассказать забыли :) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 17:56 |
|
Чем асинхронные сервлеты отличаются от Sping WebFlux
|
|||
---|---|---|---|
#18+
[quot Озверин] В чем плюс? В том, что мы возвращаем ссылку на поток из другого пула, либо вообще на новый поток, таким образом не расходуя пул потоков веб сервера. тут мы уже обсудили, что это весьма иллюзорно и иногда заменяемо конфигом сервера. ОзверинТут на сцену выходит блоикровка ресурсов. Не смотря на то, что мы пытаемся вернуть ответ асинхронно, все равно некоторые операции могут "держать" поток запроса. Например, чо нить мы заливаем на сервак долгое. Что делать? Да тоже самое, но немного в другом ключе: 1. Сказать, хочу асинхронной работы 2. Дождаться когда контекст вернет новый поток, в котором будут средства для неблокирующего чтения ваших данных 3. В этом потоке уже заливать данные 4. Поток запроса отпустить. Я вот это не совсем понял. Мне кажется это релевантно для медленного коннекшена или медленного клиента, который медленно шлёт или принимает. Какие ещё могут быть точки торможения я не представляю. То как там NIO будет работать с вводом выводом это уже не так интересно. Меня вполне удовлетворит абстракция, что она это сделает эффективно. Озверин В java8 никаких реактив стримов не было, была собственная имплементация от нетфликса - rxjava(вроде, если не ошибаюсь). Ее то и использовали поцоны из спринга. В java9 уже была rxjava2 вроде как, короче, реактив стримы стали ядром системы. WebFlux построен на основе своего же спрингового Proactor(Не Rxjava то бишь) авторЖаль тут парень какой-то black чего-то там не пишет больше. И форум в руках ...короче не у кого даже спросить, чтобы поправили. Ага вот он "Blazkowicz" Сгинул отсюда( ... |
|||
:
Нравится:
Не нравится:
|
|||
28.06.2019, 18:17 |
|
|
start [/forum/topic.php?fid=59&msg=39831737&tid=2121217]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
331ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
others: | 233ms |
total: | 684ms |
0 / 0 |