Использование службы исключения ThreadPool в tomcat для ускорения запросов - PullRequest
2 голосов
/ 15 февраля 2011

У меня есть приложение сервлета tomcat6.Один из моих запросов (в среднем ~ 10 секунд) может быть значительно улучшен с помощью многопоточности, потому что это задача только для процессора, а у меня> = 8 ядер.Мне просто интересно, если это разумно или просто косметическое изменение:

Для случая с одним пользователем это, конечно, улучшение.Но что будет, если нагрузка увеличится?У меня есть ограниченная мощность процессора, которая в данный момент распределяется между несколькими нитями HTTP-коннектора.Предполагая, что я настроил их оптимально, мне нужно было бы взять некоторые потоки из нашего пула потоков коннектора http и поместить его на какой-нибудь сервер-исполнитель, чтобы ускорить эту единственную (но важную) операцию.

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

Вы видите мою проблему?У кого-нибудь есть идеи передового опыта?Или что-то я упустил из виду?

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

В случае вопросов производительности, за некоторыми исключениями, лучшим ответом обычно является формулировка теста для сравнительного анализа и просто его проверка.

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

На этом же токене не все действия вашего приложения могут обязательно выполняться параллельно.В некоторой степени части вашего приложения будут блокировать друг друга для ввода-вывода либо в файловую систему, либо в сеть, и даже, возможно, в какой-то степени в вашей базе данных, ожидая запросов.Все это означает, что только потому, что ваше оборудование может иметь только 8 ядер (например), не означает, что вы должны строго ограничивать себя до 8 или 9 потоков.Конечно, вы не хотите сходить с ума и иметь сотни тоже.

0 голосов
/ 16 февраля 2011

Как я понимаю, вам нужно создать несколько дополнительных потоков, которые будут полезны, если, скажем, у вас есть 1 параллельный запрос, и вы разбиваете свою работу (которая занимает ~ 10 секунд) на несколько более мелких рабочих блоков, которые можно распараллелить и позже присоединился.

И вы обеспокоены тем, что это может фактически снизить производительность, если, например, у вас есть 100 одновременных запросов, поскольку у вас нет запасных ядер для распараллеливания каждого из этих 100 заданий.

Теоретически наименьшая нагрузка - это когда количество активных потоков равно количеству физических ядер. Поэтому вам нужно задать себе вопрос - каков ваш наиболее распространенный случай (сколько пользователей в системе?) И какую цену вы готовы заплатить, если количество пользователей достигнет максимума.

Во всяком случае, я полностью согласен с Тимом в том, что вы должны сравнивать, судить об этом теоретически практически невозможно. Например, ваши результаты могут быть совершенно другими, если ваша 10-секундная задача на 100% связана с ЦП, против 80% - с ЦП. Мера, не угадай .

...