2012-07-11 7 views
0
кратной

В нашем многопоточном Java приложение, мы используем LinkedBlockingDeque отдельный экземпляр для каждого потока, предположим, темы (c1, c2, .... C200)LinkedBlockingDeque.take() - отдельный экземпляр в потоке

Темы T1 & T2 принимает данные из сокета &, добавляет объект в конкретный потребительский Q от c1 до c200.

Бесконечный цикл внутри прогона(), который вызывает LinkedBlockingDeque.take()

В нагрузку запустить использование процессора для самого javae.exe составляет 40%. Когда мы суммируем другой процесс в системе, общее использование ЦП достигает 90%.

Используя JavaVisualVM бег() принимает больше ресурсов процессора, и мы заподозрить LinkedBlockingDeque.take()

Так пытавшихся альтернативы, как thread.wait и уведомления и Thread.Sleep (0), но без изменений.

Причина, по которой каждый потребитель, имеющий отдельный Q для двух причин, 1.There может быть больше, чем один запрос потребителя c1 от T1 или T2 2.Если мы сбрасывать все REQ в одном д, времени для Seach c1 до c200 будет больше, и критерии поиска будут расширяться. 3.And пусть потребитель имеет отдельный Q для обработки запросов тира

Попытки уменьшить загрузку процессора и нуждается в ваших входах ...

SD

ответ

0
  1. сделать профилирование и сделать что методы очереди занимают относительно много процессорного времени. Является ли ваша обработка сообщений настолько простой, что ее сравнивают с отправкой/записью в/из очереди? Сколько сообщений обрабатывается в секунду? Сколько процессоров есть? Если каждый процессор обрабатывает менее 100 тыс. Сообщений в секунду, то вполне вероятно, что причиной является не доступ к очередям, а сама обработка сообщений.

  2. Вложение в LinkedBlockingDeque создает экземпляр вспомогательного объекта. И я подозреваю, каждое новое сообщение выделено из кучи, так что 2 создания за сообщение. Попробуйте использовать пул предварительно распределенных сообщений и циклических буферов.

  3. 200 потоков слишком много. Это означает, что слишком много переключателей контекста. Попробуйте использовать библиотеки актеров и пулы потоков, например, https://github.com/rfqu/df4j (да, это мое).

  4. Проверьте, подходит ли http://code.google.com/p/disruptor/ для ваших нужд.

+0

Благодарим за отзыв, 1. сообщения будут обработаны по запросу. не более 200 сообщений в секунду. 2 процессора. Если для потребителя нет сообщения, то LinkedBlockingDeque.take() вызывается для блокировки до получения сообщения. 2) Сообщение содержит уникальные идентификаторы для конкретного потребителя. для других двух точек понятия не имею. но увидеть. – user1517020

+0

Для такой низкой скорости передачи сообщений маловероятно, что настройка политики связи может иметь какой-либо эффект. Однако я бы попробовал следующий вариант: одиночная очередь сообщений, 1 или 2 потребительских потока, читаемых из очереди, потребители представлены как объекты (а не потоки) методом void processMessage (Message m). Потребительские потоки принимают сообщения и помещают их в объекты-потребители, выбранные по содержимому сообщения. При использовании 2 потоков дополнительные меры предосторожности требуют не одновременного доступа к одному и тому же объекту-потребителю (классическая версия для модели актера): например, имеют дополнительную очередь для каждого потребителя. –

+0

Спасибо.с единой общей очередью каждый потребитель будет обрабатывать данные. какова максимальная скорость сообщения, которую мы можем использовать с этим типом дизайна. – user1517020

Смежные вопросы