최대 사용자 연결 수


24

SQL Server 2012 Standard Edition에서 최대 사용자 연결 수는 32,767이라는 것을 알고 있습니다. 이 번호로 향하고 있다면 DBA로 무엇을해야합니까?

현재 30,000 명의 사용자 연결이 있으며이 수가 증가 할 것으로 예상됩니다.

여기에 이미지 설명을 입력하십시오


5
앱에서 가져온 것이면 앱이 완료되면 연결을 닫아야합니다. 연결을 열린 상태로두면이 한계에 도달 할 수 있습니다.
Mark Sinkinson

답변:


31

연결의 최대 수 SQL Server 버전에서와 판은 32,767입니다.

다음을보고 현재 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;

여러 SQL Server 노드에서 데이터를 샤딩하여 연결 수를 32,767 개 이상으로 선형 확장 할 수 있습니다. 그러나 제 생각에는 연결 수를 제한하는 방법으로 샤딩을 사용하는 것은 거미를 죽이기 위해 원자 폭탄을 사용하는 것과 비슷합니다. 그것은 거미 죽일 것이지만 하루가 끝날 때 더 큰 문제 가있을 수 있습니다. 말할 것도없이, 원자 폭탄을 만드는 것은 꽤 힘든 일이며, 샤딩을 제대로 구현하는 것은 말할 것도 없습니다.


1
status 및 last_request_start_time과 sys.dm_exec_ 세션 에서 is_user_process를 사용 하는 대신 sys.dm_exec_ 연결 에서 most_recent_sql_handle을 사용하여 " killable " 세션 을 식별해야하는 이유를 설명 할 수 있습니까 ? 이상한 선택 인 것 같습니다.
마이크 셰릴 '고양이 리콜'

@Mike가 좋은 지적입니다. 당시에는 연결 풀링으로 열리고 사용되지 않은 연결에 대해 순수하게 생각하고있었습니다. is_user_process한정자 를 추가하는 것이 좋으며 , last_request_start_time최근에 있었던 세션을 배제하는 것은 결코 아프지 않을 것 입니다. 얼마나 최근에요? 또 다른 좋은 질문입니다.
Max Vernon

last_request_start_time은 아마도 새로운 것보다 오래된 것이어야합니다. 안전하게 "킬 수있는"사용자 세션은 잠자고 며칠 동안 요청을하지 않은 세션이라고 생각합니다. 컷오프 시간은 애플리케이션 프로그래머가 얼마나 잘 정리했는지에 달려 있습니다.
Mike Sherrill 'Cat

12

과거에 연결 풀링에서 이상한 동작을 겪어 왔으며 시나리오가 이러한 상황 중 하나와 잘 맞습니다. 응용 프로그램이 연결 풀링을 사용하는 경우 (그리고 여전히 확인하거나 거부 할 때까지 여전히 추측 중입니다) 열려있는 많은 연결이 유지됩니다. 이것은 의도적으로 설계된 동작입니다.

연결 풀링은 데이터베이스 연결 작성의 오버 헤드를 줄이는 것을 목표로합니다. 예를 들어 연결 풀 3을 예로 들어 보겠습니다. 라이프 사이클에 알 수있는 한 콜드 연결 풀 캐시에서 시작하여 다음과 같이 진행됩니다.

  1. 응용 프로그램 사용자 A가 데이터베이스 연결을 요청합니다
  2. 연결 풀은 데이터베이스에 대한 연결 스레드 1을 시작합니다.
  3. 응용 프로그램 사용자 B가 데이터베이스에 연결을 요청합니다.
  4. 연결 풀은 데이터베이스에 대한 연결 스레드 2를 시작합니다.
  5. 응용 프로그램 사용자 A가 연결 풀을 닫습니다 ...
  6. 응용 프로그램 사용자 C가 데이터베이스 연결을 요청합니다.
  7. sp_reset_connection스레드 1의 연결 풀 문제
  8. 연결 풀이 스레드 1을 응용 프로그램 사용자 C에 할당

이것은 지나치게 단순화되었지만 두드러진 요점은 다음과 같습니다.

  • 데이터베이스 또는 연결 풀이 연결을 강제로 닫을 때까지 연결 풀 스레드 풀 과 데이터베이스 간에 연결이 열린 상태로 유지 됩니다.
  • 다른 사용자가 해당 스레드를 재사용 할 때까지 마지막 세션 실행 컨텍스트를 사용하여 연결이 열린 상태로 유지됩니다 sp_reset_connection.

다음은 이러한 결론을 내리기 위해 사용한 참고 자료입니다.

SQL Server DBA에 대한 연결 풀링

고아 거래의 경우

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.