По моему опыту, есть 3 основных типа таймаутов, которые вы можете получить от SQL Server:
1) InvalidOperationException
- Ошибка для клиента получить пул соединения из своего пула до истечения времени ожидания, указанного в командной строке (по умолчанию 15 секунд). Пул клиента имеет максимальный размер, и все пулы подключений используются и остаются в использовании до истечения времени ожидания.
2) SQLException
- Тайм-аут соединения. Пул соединений клиента создает новое соединение с базой данных, но база данных не отвечает до истечения времени ожидания, указанного в командной строке (по умолчанию 15 секунд).
3) SQLException
- Тайм-аут команды. Соединение было получено, но время, затраченное оператором SQL на выполнение команды, превысило время ожидания, указанное в свойстве CommandTimeout команды (по умолчанию 30 секунд)
Ваши обстоятельства, когда сервер работает нормально до тех пор, пока нагрузка не будет добавлена, походят на случай № 1. Я обнаружил, что тайм-ауты приходят очень быстро - обычно 2 секунды.
Я нашел решение этой проблемы, чтобы увеличить максимальное количество потоков в SQL Server. По умолчанию ноль - пусть SQL Server решит. Я видел случаи, когда полный сервер сидит с небольшим использованием ресурсов, в то время как он ограничивал себя, выделяя слишком мало потоков.
Вы можете увеличить настройку максимального количества потоков с помощью этого transact-sql:
sp_configure 'max worker threads', 8192
go
Reconfigure
Затем перезапустите службу SQL.
Кстати, вы можете увидеть, сколько потоков в настоящий момент выделено SQL Server с помощью этой команды:
select sum(current_workers_count) from sys.dm_os_schedulers
Этот параметр потоков имеет огромное значение для работы SQL Server при многих подключениях. SQL Server перестает отвечать на запросы, если у него заканчиваются потоки.