powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ActiveMQ, создание большого числа консюмеров
25 сообщений из 51, страница 1 из 3
ActiveMQ, создание большого числа консюмеров
    #37683976
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Столкнулся с проблемой. Есть некий продукт, который использует axis2 jms транспорт.
Данный продукт выступает в роли клиентской стороны (относительно брокера), создает до 3000 консюмеров, используя брокер - ActiveMq.
Использовал различные опции тюнинга на клиенсткой стороне..(различные опции jms кеширования, время ожидания и тд..немного даже код подправил у транспорта) В итоге добился того, что первая тысяча консюмером создается влет - около 10 секунд.
Далее начинаются проблемы, каждый новый консюмер создается всё дольше и дольше. Доходит до 1500 тысяч и дальше глухо.. , но всё же продолжает работать.
В создании консюмером исползуется пул тредов, который настраивается через проперти транспорта. В пропертях тоже выставил min и core размер пула тредов..
В JVM, в связи с большим числом тредов увеличил параметр -Xss.

в jms использую nio транспорт.
Ничего не помогает:(

В логах сервера (который создает консюмеры) вижу в конце концов такой вот лог:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
java.nio.channels.ClosedChannelException
        at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSele
ctableChannel.java:167)
        at org.apache.activemq.transport.nio.SelectorSelection$1.run(SelectorSel
ection.java:44)
        at org.apache.activemq.transport.nio.SelectorWorker.processIoTasks(Selec
torWorker.java:75)
        at org.apache.activemq.transport.nio.SelectorWorker.run(SelectorWorker.j
ava:91)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
utor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:908)
        at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
        at org.apache.activemq.transport.nio.SelectorSelection$2.run(SelectorSel
ection.java:60)
        at org.apache.activemq.transport.nio.SelectorWorker.processIoTasks(Selec
torWorker.java:75)
        at org.apache.activemq.transport.nio.SelectorWorker.run(SelectorWorker.j
ava:91)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
utor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:908)
        at java.lang.Thread.run(Thread.java:662)
java.lang.NullPointerException
        at org.apache.activemq.transport.nio.SelectorSelection$4.run(SelectorSel
ection.java:84)
        at org.apache.activemq.transport.nio.SelectorWorker.processIoTasks(Selec
torWorker.java:75)
        at org.apache.activemq.transport.nio.SelectorWorker.run(SelectorWorker.j
ava:91)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExec
utor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:908)
        at java.lang.Thread.run(Thread.java:662)
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37683986
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehacker,

Проанализировав, куда уходит время на создание нового консюмера, выяснил, что долго создается поток для консюмера.

С чем это может быть связано?

Тестил под виндой и линуксом, результаты одинаковы.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684005
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Xss это же размер стека для одного потока (1Мб по дефолту?). Соответственно 1500 потоков это около 1.5Гб. Память банально заканчивается. Зачем вам столько консюмеров? Сколько выделено памяти на процесс?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684037
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
"Сколько выделено памяти на процесс?" - что вы под этим подразумеваете?

Я выделял для jvm до 5 гигабайт памяти. Сжирала максимум 3 гига..
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684067
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно что создаётся поток на каждого консюмера. Как вы это обнаружили?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684068
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

В каком месте память заканчивается?
Я обеспечил ресурсы для данной задачи. Пул тредов большой, памяти предостаточно и ещё остается..
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684083
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

В коде AXI2 Jms транспорта.
Если интересно, org.apache.axis2.transport.jms.JMSListener, метод startEndpoint.
На каждый листнер консюмера - новый тред.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684112
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehackerВ каком месте память заканчивается?
Я обеспечил ресурсы для данной задачи. Пул тредов большой, памяти предостаточно и ещё остается..
Вы выдаёте минимум информации. Я отвечаю предположением. Вы сказали что на каждого консюмера создаётся новый поток. Тысячи потоков это серьезное потребление по памяти. Отсюда предположение.
Под профайлером посмотреть, когда создание тормозит, пробовали?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684130
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
"Под профайлером посмотреть, когда создание тормозит, пробовали?"
К сожалению, не пробовал. Но я запускал проект под дебаг левелом, натыкал в код аксиса различных логов и выяснил, что когда начинается замедление создания нового консюмера, то время уходит именно на создание треда. Ничего больше..

Ещё я пробовал создавать консюмеры просто из юнит теста. Но код был очень простой без использования того нагромождения, которое находится в сендере и рецивере аксис 2 транспорта. Идея наплодила 3000 консюмеров и листнеров и всё работало хорошо. С учетом того, что для каждого консюмера нужен ещё листнер получилось в сумме 6000 потоков. Те в самой-самой облегченной версии, всё работало удачно. Но не axis транспортом.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684145
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehackerВ коде AXI2 Jms транспорта.
Если интересно, org.apache.axis2.transport.jms.JMSListener, метод startEndpoint.
На каждый листнер консюмера - новый тред.
Мда, Axis2 редкостная дрянь. Уже в третий раз убеждаюсь. Не знаю какая у вас версия, но вот тут
http://www.docjar.com/html/api/org/apache/axis2/transport/jms/JMSListener.java.html
создаётся пул на каждого слушаетеля. А это даже иногда более одного потока, если у вас 3000 этих слушателей.
А покажите stacktrace до startEndpoint. Откуда оно создаётся? Может JMSListener на каждого консюмера и не нужен?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684167
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо понять зачем столько JMSListener-ов создаётся. По-моему их не должно быть много.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684170
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настройка transport.jms.CacheLevel ни на что не влияет?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684178
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Тот код, на который вы дали ссылку, вообще жесть:)
Вот этот, который у меня:
http://svn.apache.org/repos/asf/axis/axis2/java/transports/trunk/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSListener.java


Cейчас скину стэк.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684192
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Нет, не влияет.. Я с ней игрался уже. Что польное кеширование, что "none", не помогло.
Столько консюмеров нужно, тк много различных сервисов. Их действительно так очень много!
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684201
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehacker,

Если вы посмотрите внимательно код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
   for (int i=0; i<3; i++) {
            // Check the consumer count rather than the active task count. Reason: if the
            // destination is of type topic, then the transport is only ready to receive
            // messages if at least one consumer exists. This is of not much importance,
            // except for automated tests.
            if (stm.getConsumerCount() > 0) {
                log.info("Started to listen on destination : " + stm.getDestinationJNDIName() +
                    " of type " + JMSUtils.getDestinationTypeAsString(stm.getDestinationType()) +
                    " for service " + stm.getServiceName());
                return;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ignore) {}
        }



То увидите, что стоит секундная задержка. Это я убрал в коде, чтобы быстрее создавались консюмеры. Но если более детально смотреть код аксиса, то есть ещё недочеты.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684207
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehackerВот этот, который у меня:
http://svn.apache.org/repos/asf/axis/axis2/java/transports/trunk/modules/jms/src/main/java/org/apache/axis2/transport/jms/JMSListener.java

И где там создаётся поток? ServiceTaskManager вроде реюзабельный. Нет?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684209
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

в ServiceTaskManager.run()
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684218
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehacker,

а нельзя одного консьюмера на весь прием заюзать ?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684220
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так почему новый ServiceTaskManager создаётся? Нельзя его несколько раз переиспользовать?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684227
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz , помнишь у меня то же самое но для продьюсера было ?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684233
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Там для каждого ендпоинта свой ServiceTaskManager.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684235
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
justforsqlrulivehacker,

а нельзя одного консьюмера на весь прием заюзать ?

Это технически сложно очень.. Либо свой транспорт написать.
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684236
justforsqlru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehacker,

http://www.sql.ru/forum/actualthread.aspx?tid=916850&hl=producer

ну вот примерно то же но при отправке

решили использованием одного продьюсера при отправке
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684254
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
livehackerТам для каждого ендпоинта свой ServiceTaskManager.
1 endpoint это один Web Service. Учитывая, что у вас клиентская часть, то она связывается с 3000 веб сервисами?
Я правильно понял архитектуру?
...
Рейтинг: 0 / 0
ActiveMQ, создание большого числа консюмеров
    #37684255
livehacker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
justforsqlru,

При отправке можно одного продюсера использовать и у меня. Но в случае с консюмерами -нет.
...
Рейтинг: 0 / 0
25 сообщений из 51, страница 1 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / ActiveMQ, создание большого числа консюмеров
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]