Производительность RMI слишком низкая - PullRequest
1 голос
/ 27 февраля 2012

Я работал над проектом, который касается копирования данных из одной базы данных в другую.Написано в java6.И работает на распределенных машинах.У нас 9 серверных машин.Одним из них является основной узел, над которым работает мой основной модуль управления, который получает запросы на копирование и распределяет задание на другие 8 машин.

Он был начат для кодирования с JMS, чтобы распределять задачи на эту 8 машин раньше.На другом компьютере работал сервер Apache Active MQ.Но я понял, что это не очень уместно, и машины должны быть более тесно связаны, так как это вызывает некоторые накладные расходы кода, и необходимо было возвращать ответное сообщение для всех сообщений, отправляемых на подчиненные машины.Я решил изменить соединение между главным узлом и другими 8 подчиненными машинами и закодировал это с RMI.

Я закодировал сервер RMI для подчиненных машин и клиент для машины основного узла.Затем на главном узле были созданы потоки для запуска распределенных задач на подчиненных машинах.

Дело в том, что производительность резко снизилась.Обычно мне удавалось копировать около 6 ГБ данных за 6 минут из одного конкретного БД в другой.Теперь копирование 9 ГБ данных занимает более полутора часов.Раньше он занимал много ЦП, когда задача выполнялась на подчиненных машинах.Я наблюдал коэффициент использования процессора более 90%.Теперь он никогда не использует более 15%.

Мне нужно понять, что вызывает снижение производительности.Что я должен делать ?Должен ли я использовать инструмент устранения неполадок?

Редактировать ------------

Хорошо, я создал экземпляр подчиненного модуля только на моем ноутбуке и отправил на работу 16 задачна нем и на профилированном процессоре с использованием jvisualvm. Результаты приведены на рис. Результат CPU Profiler .

Методы управления в пакете (например, failTaskIfAbort (), executeSanityCheck () и т. д.) также былиприсутствует, когда я использовал JMS для машинного общения.Это заставляет меня думать, RMI потоки имеют низкий приоритет или что-то в этом роде

Я также загрузил файл nps, экспортированный из jvisualvm.Вы можете получить его здесь: результат экспортированного профиля

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Сделал некоторую выборку ЦП в модуле, и кажется, что он тратит около 90% на oracle.net.ns.Packet.receive (). Так что да, речь идет о получении данных из базы данных. Это объясняет, почему использование ЦП уменьшается.Он ожидает, что БД вернет данные. На самом деле я глупо не смотрел на производительность запросов на стороне БД. Я думал, что раньше скопировал эти 9 ГБ данных и получил хорошие результаты.Проблема заключается в доступе к многораздельным таблицам. Он не имеет ничего общего с использованием RMI / JMS для распределения задач.

0 голосов
/ 28 февраля 2012

Из комментариев

Я подозреваю, что это что-то не связанное. Похоже, ваша горлышко от бутылки - это сколько времени нужно, чтобы получить данные из вашей базы данных. Если вы загружаете до 8 клиентов одновременно, вы можете получить только 1/8 от пропускной способности базы данных на клиента. Я бы посмотрел, как он работает, когда у вас есть только один клиент (т. Е. Загрузка ЦП намного выше)

Кстати: вы можете обнаружить, что данные ограничены сетевым адаптером вашего сервера или скоростью, с которой он может получать данные из базы данных. Если это первое, у вас может быть запасной сетевой адаптер на вашем сервере, который вы можете использовать для увеличения пропускной способности.

...