Số lượng kết nối người dùng tối đa


24

Trong phiên bản tiêu chuẩn SQL Server 2012, tôi biết rằng số lượng kết nối người dùng tối đa là 32.767. Tôi nên làm gì với tư cách là một DBA nếu tôi đang hướng tới con số này?

Hiện tại có 30.000 kết nối người dùng, và con số này dự kiến ​​sẽ tăng lên.

nhập mô tả hình ảnh ở đây


5
Nếu đây là từ một ứng dụng, thì ứng dụng sẽ đóng kết nối của nó sau khi hoàn thành. Để mở một kết nối là một lý do có thể để đạt đến giới hạn này
Mark Sinkinson

Câu trả lời:


31

Các số lượng tối đa các kết nối trên các phiên bản SQL Server và các phiên bản là 32,767.

Bạn có thể xác định có bao nhiêu kết nối SQL Server hiện có bằng cách xem:

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;

Nếu tỷ lệ giữa các kết nối được sử dụng và không sử dụng từ truy vấn trên có liên quan, có khả năng nhóm kết nối được bật bởi các ứng dụng khách được kết nối với máy chủ và các kết nối đó không được sử dụng hiệu quả. Bạn có thể muốn các nhà phát triển sửa đổi chuỗi kết nối cho các ứng dụng này để giới hạn kích thước của nhóm kết nối và đảm bảo chúng được xử lý đúng các kết nối. Nếu các kết nối không được xử lý chính xác, chúng sẽ vẫn mở miễn là ứng dụng khách đang chạy.

Nếu bạn đang cảm thấy đặc biệt là dại, và nhu cầu để có được thoát khỏi tất cả các kết nối đã không được thực hiện bất cứ điều gì gần đây (không phân biệt nếu họ đang thực sự hiện thực hiện công việc), bạn có thể chạy các đoạn mã sau, mà sẽ tạo ra một danh sách các phiên có thể bị giết Bạn cần sao chép và dán các lệnh đã tạo vào cửa sổ SSMS mới để thực sự chạy các lệnh. Tôi cũng khuyên bạn nên cập nhật sơ yếu lý lịch của mình chỉ trong trường hợp .

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;

Có thể chia tỷ lệ tuyến tính số lượng kết nối ngoài 32.767 bằng cách bảo vệ dữ liệu trên nhiều nút SQL Server. Tuy nhiên, theo tôi, sử dụng shending như một cách để vượt qua giới hạn về số lượng kết nối cũng tương tự như sử dụng bom nguyên tử để giết nhện. Nó sẽ giết con nhện, nhưng bạn có thể gặp vấn đề lớn hơn vào cuối ngày. Chưa kể việc chế tạo bom nguyên tử khá khó khăn, chưa kể đến việc thực hiện shending đúng cách.


1
Bạn có thể giải thích lý do tại sao chúng ta nên xác định các phiên "có thể giết được " bằng cách sử dụng most_recent_sql_handle trong các kết nối sys.dm_exec_ thay vì sử dụng, nói, trạng thái và last_Vquest_start_time và is_user_ process trong các phiên sys.dm_exec_ không? Có vẻ như một sự lựa chọn kỳ lạ.
Mike Sherrill 'Nhớ lại mèo'

Đó là một điểm tốt, @Mike - Vào thời điểm đó, tôi đã suy nghĩ hoàn toàn về các kết nối đã được mở bằng cách kết nối và điều đó chưa từng được sử dụng. Sẽ là một ý tưởng tốt khi thêm vào is_user_processvòng loại và chắc chắn sẽ không hại gì khi loại trừ các phiên có last_request_start_timephần gần đây. Gần đây thế nào? Một câu hỏi hay.
Max Vernon

Last_Vquest_start_time có lẽ nên cũ hơn là mới hơn. Tôi nghĩ rằng một phiên người dùng "có thể giết được" an toàn sẽ là một phiên ngủ và không có yêu cầu trong một vài ngày. Tôi đoán thời gian cắt phụ thuộc vào mức độ tốt của các lập trình viên ứng dụng của chúng tôi trong việc tự dọn dẹp.
Mike Sherrill 'Nhớ lại mèo'

12

Tôi đã gặp phải hành vi kỳ lạ với việc kết nối trong quá khứ và kịch bản của bạn phù hợp với một trong những tình huống đó. Nếu ứng dụng của bạn đang sử dụng nhóm kết nối (và đó vẫn chỉ là suy đoán, tại thời điểm này, cho đến khi bạn xác nhận hoặc từ chối điều đó) thì bạn sẽ có nhiều kết nối vẫn mở. Đây là do thiết kế.

Kết nối nhóm nhằm mục đích giảm chi phí tạo kết nối cơ sở dữ liệu. Ví dụ, hãy lấy một nhóm kết nối là 3. Theo như tôi có thể nói vòng đời đi như thế này (bắt đầu từ bộ đệm của nhóm kết nối lạnh):

  1. Người dùng ứng dụng A yêu cầu kết nối tới cơ sở dữ liệu
  2. Nhóm kết nối bắt đầu kết nối luồng 1 đến cơ sở dữ liệu
  3. Người dùng ứng dụng B yêu cầu kết nối tới cơ sở dữ liệu
  4. Nhóm kết nối bắt đầu kết nối luồng 2 đến cơ sở dữ liệu
  5. Người dùng ứng dụng A đóng kết nối của họ ... với nhóm kết nối
  6. Người dùng ứng dụng C yêu cầu kết nối tới cơ sở dữ liệu
  7. Sự cố nhóm kết nối sp_reset_connectiontrên luồng 1
  8. Nhóm kết nối gán luồng 1 cho người dùng Ứng dụng C

Đây là một sự đơn giản hóa, nhưng các điểm nổi bật bao gồm:

  • Kết nối sẽ vẫn mở giữa nhóm luồng nhóm kết nối và cơ sở dữ liệu cho đến khi cơ sở dữ liệu hoặc nhóm kết nối buộc đóng kết nối
  • Kết nối vẫn mở với bối cảnh thực thi phiên cuối cùng cho đến khi luồng đó được sử dụng lại bởi người dùng khác, tại thời điểm đó sp_reset_connectionđược gọi.

Đây là tài liệu tham khảo mà tôi đã sử dụng để đi đến những kết luận này.

Kết nối nhóm cho SQL Server DBA

Các trường hợp giao dịch mồ côi

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.