Балансировка потоков использования ресурсов процессора / памяти на сервере Java J2EE - PullRequest
3 голосов
/ 19 марта 2011

Я разрабатываю веб-сайт / онлайн-сервис для совместной работы над документами, который работает на JBoss. Во время тестирования на компьютере Linux с процессором 2,5 ГГц и 2 ГБ оперативной памяти отклик страницы очень быстрый, и мы планируем запустить его на этом компьютере.

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

Можете ли вы дать мне несколько советов о том, как я мог бы как-то распределить процент процессорного времени / памяти (например, не более 40%) в потоках, которые обрабатывают документы? Если это невозможно, пожалуйста, сообщите мне методологию / шаблон, который каким-то образом будет распределять нагрузку на машину между JBoss, отвечающим на запросы страниц и потоками, которые обрабатывают документы.

Привет

Ответы [ 2 ]

3 голосов
/ 19 марта 2011

В действительности нет способа выделить определенный процент процессорного времени / памяти для данного потока.Вы можете понизить приоритет потока, чтобы он не насыщал все ресурсы:

int oldPriority = Thread.currentThread().getPriority();
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
// process your documents here
Thread.currentThread().setPriority(oldPriority);

Лучшим подходом, который, вероятно, приблизит вас к указанию процента, будет использование ExecutorService с фиксированным числомпотоки и запустить всю вашу обработку документов через это.Если вы дадите ему половину от числа процессоров на вашем сервере, это фактически ограничит обработку документов до 50% процессорного времени сервера.Вы бы хотели, чтобы одноэлементная служба настраивала пул потоков следующим образом:

int threads = Runtime.getRuntime().availableProcessors() / 2;
ExecutorService service = Executors.newFixedThreadPool(threads);

Затем в своих веб-запросах вы могли бы передать Callable, который реализует обработку документов, службе и блокировать ее до тех пор, пока она не будет выполнена.завершено:

Callable<Result> callable = new DocumentProcessorCallable<Object>(doc);
Result result = service.submit(callable).get();

Или вы можете предпочесть не блокировать и немедленно вернуться, предоставив реализацию Runnable, которую вы передаете service.execute(runnable).См. ExecutorService для получения дополнительных примеров и документации.

2 голосов
/ 20 марта 2011

После того, как пользователь отправил документы, вы можете отправить их все в очередь JMS, где прослушивает только один экземпляр MDB. Таким образом, обработка документов будет последовательной и, следовательно, будет использовать только один поток (который все еще может использовать много ресурсов ЦП).

Если этого решения недостаточно, вы можете разместить удаленный MDB на другом сервере для обработки документов и, в основном, для разгрузки обработки документов. Прелесть в том, что это изменение в основном только изменение конфигурации и не требует перекомпиляции вашего приложения.

...