Пропускная способность HornetQ ограничена 4000 TPS без сохранения
Я использую HornetQ, встроенный в сервер приложений JBoss 6.1. Мои приложения (клиентское приложение, генерирующее сообщения и приложение JBoss, использующее их) не могут обрабатывать более 4000 TPS на сервере, в то время как процессор все еще находится в режиме ожидания на 60%. Я попытался удалить постоянство, чтобы проверить, не привязан ли я к диску, но это не улучшило пропускную способность.
Кажется, проблема на стороне производителя. По крайней мере, при мониторинге размера очереди она остается очень маленькой, то есть потребители не являются узким местом.
Должен ли я использовать несколько очередей, чтобы быть более эффективным? Я уже читал документацию по настройке производительности от HornetQ, но не смог найти причину этого. Или, может быть, это потому, что я использую режим AUTO_ACKNOWLEDGE? Я запускаю несколько веток для продюсеров, чтобы это не сильно повлияло. В любом случае JVM производителя не может использовать более 1 потока ЦП. Я даже пытался запустить несколько экземпляров приложения-производителя, но оно не работает быстрее. Пропускная способность сети высокая (1 Гбит / с), а мои сообщения очень малы (< 1 КБ). Кроме того, приложения производителя и потребителя работают на одном сервере. HornetQ настроен в кластере JBoss из 2 серверов.
3 ответа
Я смог решить эту проблему, используя несколько очередей. Используя JProfiler, я мог видеть блокировку в моих очередях, и все потоки ожидали этих блокировок. Я попытался с 2 очередями, и я мог удвоить производительность. Так что теперь я устанавливаю множество очередей.
Вы можете попробовать 2.3.0. Я удалил несколько блокировок при добавлении сообщений в очередь. Может быть, это увеличится с одной очереди на 2.3.0. Финал.
(в то время, когда я писал это, 2.3.0.Final должен был быть выпущен. 2.3.0.CR2 не имел этого изменения, о котором я говорю)
Вы увеличили размер окна отправки вашего клиента?
<connection-factory name="ConnectionFactory">
<producer-window-size>1000</producer-window-size>
...
Этот параметр ограничивает количество ожидающих сообщений для каждого клиента. Это относится не к одному потоку производителя, а ко всем вместе, поэтому добавление потоков не поможет, если будет достигнут этот предел. Задержки в сети заставляют Вас достигнуть этого довольно скоро.
см.: http://docs.jboss.org/hornetq/2.2.14.Final/user-manual/en/html/flow-control.html