Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / ActiveMQ, создание большого числа консюмеров / 25 сообщений из 51, страница 1 из 3
29.02.2012, 12:51:24
    #37683976
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
Всем привет!
Столкнулся с проблемой. Есть некий продукт, который использует 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
29.02.2012, 12:53:39
    #37683986
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
livehacker,

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

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

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

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

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

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

Ещё я пробовал создавать консюмеры просто из юнит теста. Но код был очень простой без использования того нагромождения, которое находится в сендере и рецивере аксис 2 транспорта. Идея наплодила 3000 консюмеров и листнеров и всё работало хорошо. С учетом того, что для каждого консюмера нужен ещё листнер получилось в сумме 6000 потоков. Те в самой-самой облегченной версии, всё работало удачно. Но не axis транспортом.
...
Рейтинг: 0 / 0
29.02.2012, 13:30:01
    #37684145
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
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
29.02.2012, 13:36:01
    #37684167
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
Надо понять зачем столько JMSListener-ов создаётся. По-моему их не должно быть много.
...
Рейтинг: 0 / 0
29.02.2012, 13:36:48
    #37684170
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
Настройка transport.jms.CacheLevel ни на что не влияет?
...
Рейтинг: 0 / 0
29.02.2012, 13:38:46
    #37684178
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
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
29.02.2012, 13:41:48
    #37684192
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
Blazkowicz,

Нет, не влияет.. Я с ней игрался уже. Что польное кеширование, что "none", не помогло.
Столько консюмеров нужно, тк много различных сервисов. Их действительно так очень много!
...
Рейтинг: 0 / 0
29.02.2012, 13:43:53
    #37684201
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
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
29.02.2012, 13:45:25
    #37684207
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
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
29.02.2012, 13:45:58
    #37684209
livehacker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ActiveMQ, создание большого числа консюмеров
Blazkowicz,

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

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

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

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

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

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

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

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

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


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