Деякі люди скажуть, що двох ниток занадто багато - я не зовсім у тому таборі :-)
Ось моя порада: міряйте, не здогадуйтесь. Одне із пропозицій - зробити його конфігуруваним і спочатку встановити його на 100, а потім випустити програмне забезпечення на диво та стежити за тим, що відбувається.
Якщо використання потоку дорівнює 3, то 100 - це занадто багато. Якщо вона залишається на 100 протягом більшої частини дня, збийте її до 200 і подивіться, що станеться.
Ви могли б на самому справі є свій код сам контролювати використання і налаштувати конфігурацію в наступний раз , він починає , але це, ймовірно , занадто багато.
Для уточнення та розробки:
Я не закликаю прокручувати власну підсистему об'єднання ниток, використовуйте ту, яка є у вас. Але, оскільки ви запитували про хорошу точку відсічення для ниток, я припускаю, що ваша реалізація пулу потоків має можливість обмежувати максимальну кількість створених потоків (що добре).
Я написав код об'єднання з'єднань для потоків і баз даних, і вони мають такі функції (які, на мою думку, є важливими для продуктивності):
- мінімальна кількість активних потоків.
- максимальна кількість ниток.
- вимкнення тем, які не використовувались деякий час.
Перший встановлює базову лінію для мінімальної продуктивності щодо клієнта пулу потоків (ця кількість потоків завжди доступна для використання). Другий встановлює обмеження на використання ресурсів активними потоками. Третя повертає вас до базової лінії в тихий час, щоб мінімізувати використання ресурсів.
Вам потрібно врівноважити використання ресурсів, що мають невикористані потоки (A), проти використання ресурсу не має достатньої кількості потоків для виконання роботи (B).
(A) - це звичайно використання пам'яті (стеки тощо), оскільки нитка, яка не працює, не буде використовувати більшу частину процесора. (B), як правило, буде затримка в обробці запитів, коли вони надходять, як вам потрібно дочекатися, коли нитка стане доступною.
Ось чому ви міряєте. Як ви заявляєте, переважна більшість ваших потоків буде чекати відповіді з бази даних, тому вони не працюватимуть. Є два фактори, які впливають на те, скільки ниток ви повинні дозволити.
Перший - це кількість доступних підключень до БД. Це може бути жорстким обмеженням, якщо ви не можете його збільшити в СУБД - я припускаю, що ваші СУБД можуть приймати необмежену кількість з'єднань у цьому випадку (хоча в ідеалі ви також повинні це вимірювати).
Тоді кількість потоків у вас має залежати від історичного використання. Мінімальний, який у вас повинен бути біг, - це мінімальна кількість, яку ви коли-небудь працювали + A%, з абсолютним мінімумом (наприклад, і зробіть його налаштованим так само, як A) 5.
Максимальна кількість потоків має бути вашим історичним максимумом + B%.
Ви також повинні стежити за змінами поведінки. Якщо з якихось причин ваше використання протягом значного часу перевищує 100% наявного (щоб це вплинуло на ефективність роботи клієнтів), вам слід збільшити максимально дозволену кількість, поки вона знову не перевищить B%.
У відповідь на "що саме я повинен вимірювати?" питання:
Те, що вам слід конкретно виміряти, - це максимальна кількість потоків при одночасному використанні (наприклад, очікування повернення з виклику БД) під навантаженням. Потім додати коефіцієнт запасу міцності на 10% , наприклад (виділено, так як інші плакати , здається, прийняти мої приклади як основні рекомендації).
Крім того, це слід зробити у виробничих умовах для настройки. Добре заздалегідь отримати оцінку, але ніколи не знаєш, яке виробництво кине твій шлях (саме тому всі ці речі повинні бути налаштовані під час виконання). Це полягає в тому, щоб уникнути такої ситуації, як несподіване подвоєння клієнтських дзвінків, що надходять.