У стандартному виданні SQL Server 2012 я знаю, що максимальна кількість підключень користувачів становить 32 767. Що мені робити як DBA, якщо я пряму до цього номера?
Наразі 30 000 підключень користувачів, і очікується, що ця кількість зросте.
У стандартному виданні SQL Server 2012 я знаю, що максимальна кількість підключень користувачів становить 32 767. Що мені робити як DBA, якщо я пряму до цього номера?
Наразі 30 000 підключень користувачів, і очікується, що ця кількість зросте.
Відповіді:
Максимальна кількість з'єднань в різних версіях SQL Server і видань 32767.
Ви можете визначити, скільки підключень на даний момент має SQL Server, переглянувши:
SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END
, CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping'
THEN 'sleeping'
ELSE 'Not Sleeping'
END
, CASE WHEN dec.most_recent_sql_handle = 0x0
THEN 'Unused'
ELSE 'Used'
END;
Якщо співвідношення між використаними та невикористаними з'єднаннями з вищезазначеного запиту стосується, ймовірно, що об'єднання з'єднань увімкнено клієнтськими програмами, підключеними до сервера, і ці з'єднання не використовуються ефективно. Можливо, ви хочете, щоб розробники модифікували рядок з'єднання для цих додатків, щоб обмежити розмір пулу з'єднань та переконатися, що вони належним чином розміщують з'єднання. Якщо з'єднання не розміщені правильно, вони залишатимуться відкритими, поки працює клієнтська програма.
Якщо ви відчуваєте себе особливо несамовито і вам потрібно позбутися всіх з'єднань, які останнім часом нічого не виконували (незалежно від того, чи справді вони зараз виконують роботу), ви можете запустити наступний код, який створить список сеансів, які можна вбити. Вам потрібно буде скопіювати та вставити згенеровані команди у нове вікно SSMS, щоб фактично запустити команди. Я також рекомендую оновлювати своє резюме на всякий випадок .
DECLARE @cmd NVARCHAR(MAX); SET @cmd = ''; SELECT @cmd = @cmd + CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';' FROM sys.dm_exec_connections dec WHERE dec.most_recent_sql_handle = 0x0;
PRINT @cmd;
Можна лінійно масштабувати кількість з'єднань, що перевищують 32 767, зменшуючи дані по декількох вузлах SQL Server. Однак, на мій погляд, використання шардингу як способу подолати обмеження кількості з'єднань аналогічно використанню атомної бомби для вбивства павука. Він буде вбивати павука, але ви просто могли б мати великі проблеми в кінці дня. Не кажучи вже про те, що скласти атомну бомбу досить важко, не кажучи вже про належне реагування на шар.
is_user_process
кваліфікатор, і, звичайно, не завадить виключити сеанси, які мають last_request_start_time
дещо останній час. Як недавно? Ще одне хороше запитання.
У минулому я стикався з дивною поведінкою при об'єднанні з'єднань, і ваш сценарій добре узгоджується з однією з таких ситуацій. Якщо у вашій програмі використовується об'єднання з'єднань (і це все ще міркування, до цього моменту, поки ви не підтвердите або не заперечите це), у вас буде багато з’єднань, які залишаються відкритими. Це за дизайном.
Об'єднання об'єднань має на меті зменшити накладні витрати на створення з'єднання з базою даних. Візьмемо, наприклад, пул підключень 3. Наскільки я можу сказати, життєвий цикл проходить приблизно так (починаючи з холодного кеша пулу з'єднань):
sp_reset_connection
на потоці 1Це надмірне спрощення, але важливі моменти включають:
sp_reset_connection
викликається.Ось довідковий матеріал, який я використовував, щоб дійти до цих висновків.