Как я могу ограничить производительность изолированного Java-кода? - PullRequest
2 голосов
/ 23 июля 2011

Я работаю над многопользовательским веб-приложением на Java, где клиенты могут использовать API веб-приложений для выполнения потенциально непослушных задач, передавая код, который будет выполняться на нашем сервере, в изолированной программной среде.

Например, клиент может написать жесткий цикл while (true), который влияет на производительность других клиентов.

Можете ли вы, ребята, придумать способы ограничить ущерб, наносимый этими видами поведения, допроизводительность других клиентов?

Мы используем Glassfish для нашего сервера приложений.

Ответы [ 4 ]

2 голосов
/ 24 июля 2011

Еще одна идея - инструментарий байт-кода. Перед загрузкой кода, отправленного вашим клиентом, обработайте его, чтобы он добавлял короткий сон в каждый цикл и для каждого вызова метода (или записи метода).

Это позволяет избежать засорения клиентами всего ЦП до тех пор, пока они не завершат работу. Конечно, они по-прежнему блокируют объект Thread (который занимает немного памяти), и замедление происходит для каждого клиента, а не только для вредоносных. Возможно, сделайте первые несколько попыток свободными, затем увеличьте время ожидания с каждой попыткой (и установите его снова, если поток должен ждать по другим причинам).

2 голосов
/ 23 июля 2011

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

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

1 голос
/ 23 июля 2011

Вы можете использовать родительский поток, чтобы запускать каждый запрос в отдельном потоке, как уже предлагалось, но затем отслеживать время процессора, используемое потоками, используя класс ThreadMXBean. После этого родительский поток может уничтожить все потоки, которые ведут себя не так. Это если, конечно, вы можете установить какие-то разумные критерии того, сколько процессорного времени поток должен или не должен использовать. Может быть, правилом может быть то, что определенное начальное количество времени плюс определенное дополнительное количество в секунду времени настенных часов в порядке?

Я бы сделал так, чтобы эти потоки клиентских запросов имели более низкий приоритет, чем потоки, отвечающие за их мониторинг.

1 голос
/ 23 июля 2011

Современные серверы приложений используют Thread Pooling для повышения производительности.Проблема в том, что одно плохое яблоко может испортить кучу.Что вам нужно, так это сервер приложений с одним потоком или, возможно, процесс для каждого запроса.Конечно, будут компромиссы.но ОС будет следить за тем, чтобы время обработки распределялось равномерно.
ПРИМЕЧАНИЕ. После небольшого исследования вам понадобится механизм, который будет создавать другой процесс для каждого запроса.Если нет, то пользователь может нанести вред вашему сервлетному движку, имея сервлеты с бесконечными циклами и затем отправляя несколько запросов.Или он мог бы просто сделать System.exit в своем коде и убить всех.

...