Maksimum kullanıcı bağlantısı sayısı


24

SQL Server 2012 Standard sürümünde, maksimum kullanıcı bağlantı sayısının 32,767 olduğunu biliyorum. Bu numaraya yöneliyorsam DBA olarak ne yapmalıyım?

Şu anda 30.000 kullanıcı bağlantısı var ve bu sayının artması bekleniyor.

görüntü tanımını buraya girin


5
Bunlar bir uygulamadan geliyorsa, uygulama bittiğinde uygulamanın bağlantısını kapatması gerekir. Bir bağlantının açık
bırakılması

Yanıtlar:


31

Maksimum bağlantı sayısı SQL Server sürümleri arasında ve sürümleri 32767 olduğunu.

Şu anda kaç tane SQL Server bağlantısına sahip olduğunuzu belirleyebilirsiniz:

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;

Yukarıdaki sorgudan kullanılmış ve kullanılmamış bağlantılar arasındaki oran ilgili ise, bağlantı havuzunun sunucuya bağlı istemci uygulamaları tarafından etkinleştirilmesi ve bu bağlantıların verimli kullanılmaması muhtemeldir. Geliştiricilerin, bu havuzlar için bağlantı havuzunun boyutunu sınırlamak üzere bağlantı dizesini değiştirmelerini ve bağlantıları uygun şekilde atmalarını sağlamak isteyebilirsiniz. Bağlantılar doğru şekilde kurulmuyorsa, istemci uygulaması çalıştığı sürece açık kalacaktır.

Kendinizi çok kederli hissediyorsanız ve yakın zamanda herhangi bir şey yapmayan tüm bağlantılardan kurtulmanız gerekiyorsa ( şu anda gerçekten çalışmakta olup olmadıklarına bakılmaksızın ), aşağıdaki kodu çalıştırabilirsiniz; öldürülebilir. Komutları gerçekten çalıştırmak için oluşturulan komutları kopyalayıp yeni bir SSMS penceresine yapıştırmanız gerekir. Ayrıca özgeçmişinizi kadar güncel olan öneriyoruz ihtimale karşı .

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;

Birden fazla SQL Server düğümünde verileri paylaşarak, bağlantı sayısını 32,767'nin ötesine doğrusal olarak ölçeklendirmek mümkündür. Ancak, bence, paylaşmanın, bağlantı sayısındaki sınırın aşılması için bir yol olarak kullanılması, bir örümceği öldürmek için bir atom bombası kullanmaya benzer. Bu olacak örümcek öldürmek, ama sadece belki günün sonunda büyük sorunlarımız var. Bir atom bombası inşa etmenin çok zor olduğunu söylemeye gerek yok, aletlerin düzgünce yapılmasından bahsetmiyorum bile.


1
Neden “öldürülebilir” i tanımlamamız gerektiğini açıklayabilir misiniz? oturumları sys.dm_exec_ oturumlarında , status ve last_request_start_time ve is_user_process kullanmak yerine s_r.dm_exec_ bağlantılarında most_recent_sql_handle komutunu kullanarak ? Tuhaf bir seçim gibi görünüyor.
Mike Sherrill 'Kedi Geri Çağırma'

Bu iyi bir nokta, @Mike - O zamanlar sadece bağlantı havuzları tarafından açılan ve hiç kullanılmamış bağlantılar hakkında düşünüyordum. Niteleyiciye eklemek iyi bir fikir is_user_processolacaktır ve kesinlikle last_request_start_timeyeni olan bir seansı dışlamak kesinlikle zarar vermez . Ne kadar yakın? Başka bir güzel soru.
Max Vernon

Last_request_start_time muhtemelen daha yenisinden daha büyük olmalıdır. Güvenli bir şekilde "katlanabilen" bir kullanıcı oturumunun uyuyan ve birkaç gündür talep etmediği bir oturum olacağını düşünüyorum. Sanırım kesim süresi, uygulama programcılarımızın kendilerini temizlediklerinde ne kadar iyi olduklarına bağlı.
Mike Sherrill 'Kedi Geri Çağırma'

12

Geçmişte bağlantı havuzlama ile garip davranışlarda bulundum ve senaryo bu durumlardan biriyle iyi uyum gösteriyor. Uygulamanız bağlantı havuzu kullanıyorsa (ve bu hala spekülasyonsa, bu noktada, siz onaylayıncaya veya reddedene kadar) o zaman açık kalan birçok bağlantınız olacak. Bu, tasarım gereğidir.

Bağlantı havuzu oluşturma, veritabanı bağlantısı oluşturma yükünü azaltmayı amaçlar. Örneğin 3'lük bir bağlantı havuzu alalım. Yaşam döngüsünün söyleyebileceğim kadarıyla (soğuk bağlantı havuzu önbelleğinden başlayarak) şöyle bir şey olur:

  1. Uygulama kullanıcısı A veritabanına bağlantı ister
  2. Bağlantı havuzu, 1 numaralı iş parçacığını veritabanına başlatır.
  3. Uygulama kullanıcısı B veritabanına bağlantı ister
  4. Bağlantı havuzu, bağlantı 2'yi veritabanına başlatıyor
  5. Uygulama kullanıcısı A bağlantılarını ... bağlantı havuzuna kapatır
  6. Uygulama kullanıcısı C veritabanına bağlantı ister
  7. İş sp_reset_connectionparçacığı üzerinde bağlantı havuzu sorunları 1
  8. Bağlantı havuzu, iş parçacığı 1'i Uygulama kullanıcısı C'ye atar.

Bu bir aşırı basitleştirmedir, ancak göze çarpan noktalar şunlardır:

  • Bağlantı, bağlantı havuzu iş parçacığı havuzu ve veritabanı arasında açık kalacaktır ; veritabanı veya bağlantı havuzu zorla bağlantıyı kapatana kadar
  • Bağlantı, o iş parçacığı başka bir kullanıcı tarafından yeniden kullanılıncaya kadar, son oturum yürütme bağlamında açık kalır. sp_reset_connection .

İşte bu sonuçlara geldiğim referans malzemesi.

SQL Server DBA için Bağlantı Havuzu

Artık işlem davası

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.