SMO, SSMS, localhost'a bağlanırken SQL Server'ın Docker'da yönetimi için yavaştır


9

TL; DR: SQL Server Docker kapsayıcısına IPv6 geri döngüsüne ( ::1) çözümlenen bir adla bağlanırken SMO çağrıları gerçekten yavaş. Kullanırken 127.0.0.1, hızlılar.


Docker görüntüsü microsoft / mssql-server-windows-developer nasıl kullanılacağını öğrenmeye çalışıyorum . Microsoft'un belgelerine göre, bu kapsayıcı yalnızca 1433 numaralı TCP bağlantı noktasını açığa çıkarır.

docker run -d -p 1433:1433 -e sa_password=Passw0rd! -e ACCEPT_EULA=Y -v C:\dockerdb:C:\dockerdb microsoft/mssql-server-windows-developer

Kapsayıcıyı Windows 10'da çalıştırıyorum ve SQL Server kimlik doğrulamasıyla kimlik doğrulaması yapmayı ve Windows ana bilgisayarında sqlcmd ve SSMS 17.4 kullanarak yerel sunucuya (localhost veya “.” Bağlanıyor) sorguları çalıştırmayı ve SQL İşlemlerini başarıyla gerçekleştirdim. IP ile bağlanan bir mac yandaki Studio. Sorguları bu şekilde çalıştırırken belirgin bir performans sorunu görmüyorum.

SSMS'de, nesne gezgine de göz atabilirim, ancak örnek gezgini penceresini açmak veya bir veritabanı eklemek gibi, nesne gezginde bir nesne üzerinde sağ tıklama menüsünden bir şey yapmaya çalışırsam, SSMS yaklaşık 5 için bir yanıt göstermez -10 dakika, bu noktada istediğim pencereyi veya şu hata iletisini görüntüler:

SSMS Hata mesajı

Ayrıca SMO Scripter nesnesini kullanarak bu örneğe karşı bazı PowerShell komut dosyaları yapmaya çalışıyorum ve aynı tür davranış görmek. PS betiği, veritabanındaki nesneler arasında dolaşır ve bunları dosyaya yazar ve nesnelerin listesini nispeten hızlı bir şekilde toplamak için çalışırken, her bir nesnenin betiği 5-10 dakika sürer - kullanılamayacak kadar yavaştır.

Açıkta kalan tek portun yeterli olmadığı ve SMO ve SSMS'nin onları yavaşlatan benzer bir şekilde bağlanmaya çalıştıklarına dair bir önsezim var. Ayrıca, localhost'a bağlanırken, bu araçların genellikle güvenlik duvarı olmayacak başka iletişim kanalları olduğu varsayılabilir mi? Kullanabileceğim başka bağlantı parametreleri var mı? Herkes SSMS'nin SQL Server ile konuşmak için SMO veya başka bir şey kullandığını varsayımımı doğrulayabilir mi?


GÜNCELLEME: Hala araştırıyorum, ancak bunun kaynak kısıtlamaları ile ilgili bir Docker sorunu olması makul. Bu belgelerin çoğu Windows Konteynerleri herhangi bir varsayılan kaynak sınırlamaları yoktur belirtmek görünüyor çünkü kafa karıştırıcı (ve bunlar olabilir değil Windows GUI Docker ayarlanabilir - sadece Linux konteynerler için ), ancak gerçekte, Windows gibi görünüyor Windows 10 üzerinde çalışan kapsayıcılar varsayılan 1GB RAM ayırma alır. Hala çalışan bir kapsayıcıyı RAM ve CPU tahsisini görmek için nasıl inceleyeceğimizi anlamaya çalışıyorum, ama sonra sadece docker runparametreleri kullanarak, varsayılanları ne olursa olsun artırmayı denemeliyim .


DAHA FAZLA GÜNCELLEME: Docker'dan, kapsayıcı için hangi CPU ve bellek sınırlarının mevcut olduğunu söyleyen her türlü güvenilir metriği elde edemiyorum. Araştırma Değişen ya liman işçisi kapları, varsayılan olarak bir bellek sınırı olmadığını belirtir veya yaptıklarını ve 1GB, ama şu anda doğrulayabilir tüm yani docker statsSQL konteyner yalnızca diyor kullanılarak 750 ila 850 Meg ve ne zaman Kullanılabilir belleği 4 gb'ye ayarlamak için bir çalışma parametresi eklemeye çalışıyorum, hata veriyor. Ben soruşturma o iplik aşağıdaki durdu ve farklı bir bağırsak kontrolü için gitti Yani: çalışan kabın üzerine interaktif bir powershell oturumu giren ve sonra benim powershell komut yukarıda bağlantılı çağırarak kap.

Konteynerin içinde koşarken hiçbir sorun yoktu. Sadece birkaç dakika içinde 2780 nesneler arasında parladı. Sanırım bu sorunun kapsayıcı / ana bilgisayar sınırında olduğunu doğruladı, bu yüzden o UDP bağlantı noktasını açıp açamayacağımı göreceğim. GÜNCELLEME: 1434 UDP bağlantı noktasını açmak işe yaramadı.


DAHA FAZLA GÜNCELLEME — Geçici Çözüm Elde Edildi, Kaynak kısıtlaması sorunu değil: Windows kapsayıcıları için büyük bellek ayırmalarını ayarlama ile ilgili sorunlar var gibi görünüyor - 3g ve 2g için benzer hatalar alıyordum, ancak sonunda kapsayıcıyı 1.5g ile başlatabiliyordum ve docker stats(Sanırım) 1GB varsayılan ayırma ile çalıştığını doğruladı konteyner için bir fark gördüm. Varsayılan ayarlarda, PRIV WORKING SET stat (herhangi bir belge bulamıyorum, ama en iyi tahminim RAM) 700MiB ile 850MiB arasında. İledocker run —memory="1.5g"Set, 1.0GiB civarında. Bu yüzden genişledi, ancak tahsisin daha önce olduğundan daha fazla serbest bırakıldığı görülüyor. Bu (belki de yanlış) (kesinlikle NO yük çalıştıran ve NO kullanıcı veritabanları olan) bu sunucunun bellek baskısı altında olmadığı anlamına gelir. Maksimum sunucu belleği ayarını varsayılan maksimum 2PiB olarak ayarlandığını doğrulamak için kontrol ettim.

Sonra işler tuhaflaştı. Hala çeşitli konumlardan powershell betiğimi çalıştırarak işleri test ediyorum. Konteynerin içinde hızlı, ana bilgisayarda yavaş. Sonra ağdaki başka bir windows makinesine RDP'ledim ve komut dosyasını THAT makinesinden çalıştırdım, Windows 10 ana bilgisayarıma IP ile bağlandım. Ve HIZLI oldu! Bu, yerel ana bilgisayar olması gereken bir şeye bağlanırken, SMO'nun TCP bağlantısına geri dönmeden önce çok uzun bir zaman aşımı bekleyen 1433 TCP bağlantı noktası dışında bir şey kullanarak SQL Server'a bağlanmaya çalıştığı teorisini destekliyor gibi görünüyor.

Localhost dışında bir ad ile localhost başvurmak için bir hosts dosya girişi girerek bu teori doğrulamaya karar verdim:

        127.0.0.1       dockersucks

SSMS'de localhost veya "." Yerine dockersucks'a bağlandım ve hemen işler daha hızlıydı. Nesne gezgininde gezinmek her zamanki gibi oldu ve veritabanı ekle veya sunucu özellikleri gibi açılış panelleri normalde olduğu kadar hızlı oldu. Ve, bu takma adı sunucu adı olarak kullanarak windows 10 ana bilgisayardan powershell betiğimi çalıştırdığımda da hızlıydı.

Bu güncellemeyi bir cevap yerine soruya ekledim, çünkü hala bunun neden oluştuğuna dair bir açıklama arıyorum ve bu adla "localhost" bağlantısı için düzeltmenin bir yolu varsa.


Belki docker örneğiniz az güç harcanıyor? Bir liman sorunu olsaydı, hiç işe yaradığını göreceğinizden şüpheliyim, bu yüzden o yolda fazla zaman harcamazdım.
LowlyDBA

Evet, bunu düşünüyordum, ancak sorgu performansı iyi görünüyor, bu yüzden sadece belirli türdeki eylemlerle sınırlı görünüyor. Ayrıca SMO işlerini konteynerin İÇİNDEN çalıştırmayı test etmem ve sorunun orada olmadığını doğrulamam gerekiyor.
NReilingh

1
O kısmı kaçırmadım. SQL Server bağlantı havuzu kullanır. Bunun sinir bozucu olduğunu anlıyorum, ancak konteynerin (veya bu durumda "garip Hyper-V lite VM") yeterli RAM'e sahip olmasını sağlamak için sizi etkilemek istiyorum. PS betiğiniz "hızlı bir şekilde" çalıştı, ancak ~ 3000 nesneler arasında geçen dakikalar , yeterli RAM'e sahip bir makinede (yani 2 GB'den fazla) yavaş çalışıyor .
Randolph West

1
Dürüst olmak gerekirse, muhtemelen bir Ubuntu Hyper-V VM'yi makinenizde döndürmekten ve Linux için SQL Server'ı yüklemekten daha iyidir.
Randolph West

1
@bazzilic Cevabımda neden olduğunu açıklarım. Açıklığa ihtiyacınız varsa lütfen orada yorum yapın.
NReilingh

Yanıtlar:


3

Bu büyük olasılıkla bir RAM açlığı sorunudur.

Kontrol edilecek şeyler:

  • Kapta atanmış 4 GB RAM var mı? Bu cevabı kontrol edin .
  • Kapsayıcı içindeki SQL Server için Maksimum Sunucu Belleği ayarını yapılandırdınız mı? SQL Server'ın kapta ne kadar RAM görebildiğine bağlı olarak, bu 1 GB ila 3.25 GB arasında bir değere ayarlanabilir.
  • Ana makinenizin RAM'i tükendi ve Docker'ın diske disk belleği koyması mümkün mü? Herhangi bir yabancı uygulamayı kapatın (web tarayıcıları RAM'in büyük tüketicileridir). SSMS'nin kullanılabilir olması için yaklaşık 1 GB çalışan RAM'e ihtiyacı vardır.
  • Bu yeniden başlatmadan sonra daha hızlı mı?

Bunu kendim yapıyordum , Docker deposundan Windows için Docker Topluluk Sürümü'nü yükler ve sonra SQL Server Docker görüntüsünü bu şekilde yüklerdim .

İnternet bağlantınız yeterince hızlıysa, 5 dakikadan kısa bir sürede çalışmaya başlayabilir ve kaynakları çok daha kolay bir şekilde tahsis edebilirsiniz.

EDIT: Ah, ağ oluşturma.


Bunu yanlış anladığınızdan emin değilim, ancak kap içinde SSMS çalıştırmıyorum . Windows kapsayıcıları şu anda RDP bağlantılarını veya GUI'leri desteklemediğinden bu mümkün değildir. Zaten SQL Server'ın yavaş olmadığını biliyorum - ama bu docker kapsayıcısını kaynaklar için açlıktan ölüyorum. Kapsayıcı ve SSMS'yi çalıştıran Windows 10 ana makinesi 10GB RAM ve 2 çekirdeğe sahiptir, ancak konteynere ne kadar ayrılacağından emin değilim.
NReilingh

Cevabım yeniden yazıldı
Randolph West

Ek bilgi için Q güncellemesine bakın. Bunun microsoft'un kendi kapsayıcı görüntüsü oluşturma olduğunu unutmayın, bu yüzden kap içindeki ayarların bir sorun olmayacağını varsayarak oldukça güvenli olduğumuzu düşünüyorum.
NReilingh

2
Lütfen bu varsayımı yapmayın!
Randolph West

@NReilingh -mSeçeneği araştırmanız için cevabıma bir URL ekledim .
Randolph West

3

Buradaki temel fark, SSMS / SMO'nun IPv4 veya IPv6 ile bağlanmaya çalışıp çalışmadığıdır. Eğer bir yaparsanız ping localhostistemi bir komuta, bunun için gidermek görmelisiniz ::1IPv6 eşdeğer olan 127.0.0.1. Bağlanmak .aynı şeyi yapar.

Sizin docker runkomut sadece bağlantı noktasını 1433 açığa 127.0.0.1. netstat -aHangi bağlantı noktalarının kullanılabilir olduğunu görmek için çalıştırarak bunu doğrulayabilirsiniz .

Oluşturduğunuz hosts dosyası diğer adı doğrudan çözümlenir 127.0.0.1, ancak buna gerek yoktur, çünkü 127.0.0.1doğrudan SSMS'ye bağlanıp sorununuzu bu şekilde çözebilirsiniz. IPv6'yı tamamen ana bilgisayar sisteminizde kapatmak da muhtemelen işe yarayacaktır, ancak bunun Windows 10'da ne kadar tavsiye edilebilir olduğundan emin değilim.

Birisi bana IPv6'nın neden kırılmasına neden olduğunu söyleyebilirse kabul etmek için alternatif bir cevap düşüneceğim.


Tcp: localhost'a bağlanmayı denediniz mi? SSMS / SMO, ad localhost veya (local) veya hatta "." Olduğunda paylaşılan bir bellek veya adlandırılmış kanal bağlantısı kurmaya çalışıyor olabilir. ve 1. SSMS 17.4'ün Nesne Gezgini'nde kesinlikle SMO kullanıp kullanmadığını bilmiyorum, ancak bunun mümkün olduğunu düşünüyorum.
Bay Magoo

@MisterMagoo tcp:localhostSunucu adı alanına girme hiç çalışmıyor gibi görünüyor, ancak bağlantı özelliklerinde açıkça iyileştirme yapmadan TCP / IP belirtmeyi denemiştim. Hala sorun başarısız 127.0.0.1olduğunda localhost için yavaş bir düşüş olduğunu düşünüyorum ::1. Ben SMO kullanarak komut dosyası (belki de) tekrar tekrar yeni bağlantılar oluştururken, benim sorgu pencereleri bir bağlantıyı korumak çünkü çalıştığını düşünüyorum.
NReilingh

1
@NReilingh Aynı sorunu görüyorum - sorun giderme ve açıklamalarınız gerçekten yardımcı oldu. Sql sunucu kapsayıcısını ana bilgisayar ortamımdan 127.0.0.1 ( localhost değil ) olarak ele almak, ana bilgisayardan konteyner bağlantılarına normal şekilde çalışabilmemin tek yoluydu .
rogersillito
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.