Некоторые люди скажут, что двух нитей слишком много - я не совсем в этом лагере :-)
Вот мой совет: измерить, не угадать. Одно из предложений заключается в том, чтобы сделать его настраиваемым и сначала установить его на 100, а затем выпустить программное обеспечение на волю и отслеживать, что происходит.
Если использование потоков достигает 3, то 100 - это слишком много. Если он остается на уровне 100 в течение большей части дня, увеличьте его до 200 и посмотрите, что произойдет.
Вы могли бы фактически заставить свой код контролировать использование и корректировать конфигурацию для следующего запуска, но это, вероятно, излишне.
Для уточнения и уточнения:
Я не сторонник создания собственной подсистемы пула потоков, во что бы то ни стало, используйте ту, которая у вас есть. Но, поскольку вы спрашивали о хорошей точке отсечения для потоков, я предполагаю, что ваша реализация пула потоков способна ограничить максимальное количество создаваемых потоков (что хорошо).
Я написал код пула потоков и соединений с базой данных, и у них есть следующие функции (которые я считаю важными для производительности):
- минимальное количество активных тем.
- максимальное количество потоков.
- закрытие потоков, которые давно не использовались.
Первый устанавливает базовую линию для минимальной производительности с точки зрения клиента пула потоков (это количество потоков всегда доступно для использования). Второй устанавливает ограничение на использование ресурсов активными потоками. Третий возвращает вас к базовой линии в спокойное время, чтобы минимизировать использование ресурсов.
Вам необходимо сбалансировать использование ресурсов с наличием неиспользуемых потоков (A) и использованием ресурсов с отсутствием достаточного количества потоков для выполнения работы (B).
(A) - это, как правило, использование памяти (стеки и т. Д.), Поскольку поток, не выполняющий работу, не будет использовать большую часть ЦП. (B) обычно будет задержкой в обработке запросов по мере их поступления, так как вам нужно ждать, пока поток станет доступным.
Вот почему вы измеряете. Как вы заявляете, подавляющее большинство ваших потоков будет ожидать ответа от базы данных, поэтому они не будут работать. Есть два фактора, которые влияют на количество потоков, которые вы должны учитывать.
Первый - это количество доступных подключений к БД. Это может быть жестким пределом, если вы не можете увеличить его в СУБД - я собираюсь предположить, что ваша СУБД может принимать неограниченное количество соединений в этом случае (хотя в идеале вы должны также измерять это).
Затем количество потоков, которые вы должны иметь, зависит от вашего исторического использования. Минимум, который вы должны запустить, - это минимальное число, которое вы когда-либо использовали, + A%, с абсолютным минимумом (например, и сделать его настраиваемым так же, как A) 5.
Максимальное количество потоков должно быть вашим историческим максимумом + B%.
Вы также должны следить за изменениями поведения. Если по какой-то причине ваше использование переходит к 100% доступности в течение значительного времени (чтобы это могло повлиять на производительность клиентов), вам следует увеличить максимально допустимое значение, пока оно снова не увеличится на B%.
В ответ на «что именно я должен измерить?» вопрос:
Что вы должны конкретно измерить, так это максимальное количество потоков при одновременном использовании (например, ожидание возврата из вызова БД) под нагрузкой. Затем добавить коэффициент запаса прочности на 10% , например (выделено, так как другие плакаты , кажется, принять мои примеры как основные рекомендации).
Кроме того, это следует делать в производственной среде для тюнинга. Это хорошо, чтобы получить оценку заранее, но вы никогда не знаете, какой продукт будет иметь значение (именно поэтому все эти вещи должны быть настраиваемыми во время выполнения). Это для того, чтобы поймать ситуацию, такую как неожиданное удвоение входящих вызовов клиента.