Мы боремся с проблемой в производстве, когда время от времени производительность базы данных Azure SQL значительно ухудшается. Мы знаем, что у нас есть блокировки на одной из таблиц, но эти блокировки не являются взаимоблокировками, они длинные блокировки, и через час производительность возвращается к норме. Мы пытаемся найти все возможные сценарии того, как мы получаем эти длинные блокировки (каждый запрос очень быстрый, и все анализаторы производительности могут показать нам, что вызывает длинные блокировки). Причина этого вопроса заключается в следующем:
Настройки пула соединений позволяют объединять только 200 подключений. И в большинстве случаев у нас около 10-20 открытых/объединенных соединений с базой данных. Затем внезапно начинается ряд активных соединений, и пул полностью взят. В то время как количество объединенных соединений остается ниже 200, мы видим, что число активных соединений с использованием sp_who2
достигает 1,5k-2k соединений (иногда 4k-5k).
Я построил ту же диаграмму, используя инструменты мониторинга Azure Portal. Он имеет различный период агрегации, но показывает ту же проблему:
используемая строка подключения:
Источник данных = [сервер].database.windows.net; начальный catalog = [база данных]; информация о безопасности сохраняется = True; пользователь ID = [пользователь], пароль = [пароль]; MultipleActiveResultSets = True; Соединение Timeout = 30; Max Pool Size = 200; Pooling = True; App = [AppName]
Как это возможно, учитывая ограничение пула соединений на 200 соединений?
ps: периодическая задача, длительный запрос или другой инструмент ничего не делают, мы проверили с sp_who2
все активные подключения к базе данных.