AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 197499
Accepted
NReilingh
NReilingh
Asked: 2018-02-10 06:38:06 +0800 CST2018-02-10 06:38:06 +0800 CST 2018-02-10 06:38:06 +0800 CST

SMO, SSMS são lentos para gerenciamento do SQL Server no Docker ao se conectar ao localhost

  • 772

TL;DR: Ao se conectar ao meu contêiner SQL Server Docker por meio de um nome que resolve para o loopback IPv6 ( ::1), as chamadas SMO são muito lentas. Ao usar 127.0.0.1, eles são rápidos.


Estou tentando aprender a usar a imagem do Docker microsoft/mssql-server-windows-developer . De acordo com a documentação da Microsoft, esse contêiner expõe apenas a porta 1433 TCP.

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

Estou executando o contêiner no Windows 10 e consegui iniciá-lo com êxito, autenticando com autenticação do SQL Server e executando consultas na instância usando sqlcmd e SSMS 17.4 no host do Windows (conectando-se ao localhost ou “.”) e SQL Operations Studio em um mac ao lado conectando por IP. Não vejo problemas de desempenho perceptíveis ao executar consultas dessa maneira.

No SSMS, também posso navegar no explorador de objetos, mas se eu tentar fazer algo no menu do botão direito em um objeto no explorador de objetos, como abrir a janela de parâmetros de instância ou anexar um banco de dados, o SSMS não mostra uma resposta por cerca de 5 -10 minutos, momento em que exibe a janela que solicitei ou exibe esta mensagem de erro:

Mensagem de erro SSMS

Também estou tentando fazer alguns scripts do PowerShell nessa instância usando o objeto SMO Scripter e vejo o mesmo tipo de comportamento. O script PS faz um loop pelos objetos no banco de dados e os scripts para arquivo e, embora trabalhe para reunir a lista de objetos de forma relativamente rápida, cada objeto individual leva de 5 a 10 minutos para o script - muito lento para ser usado.

Eu tenho um palpite de que a única porta exposta não é suficiente e que o SMO e o SSMS estão tentando se conectar de uma maneira semelhante que os está desacelerando. Também pode ser que, ao se conectar ao localhost, essas ferramentas suponham que haja outros canais de comunicação presentes que normalmente não seriam protegidos por firewall? Existem parâmetros de conexão adicionais que eu poderia estar usando? Alguém pode validar minha suposição de que o SSMS está usando o SMO ou outra coisa para falar com o SQL Server?


ATUALIZAÇÃO: ainda estou investigando, mas é plausível que este seja um problema do Docker em torno de restrições de recursos. Isso é confuso porque a maior parte da documentação parece indicar que os contêineres do Windows não têm restrições de recursos padrão (e não podem ser definidas na GUI do Docker para Windows — apenas para contêineres do Linux ), mas parece que, na realidade, o Windows contêineres em execução no Windows 10 obtêm uma alocação de RAM padrão de 1 GB. Ainda estou tentando descobrir como inspecionar um contêiner em execução para ver sua alocação de RAM e CPU, mas em seguida tenho que tentar aumentá-los de quaisquer que sejam os padrões, usando docker runparâmetros.


ATUALIZAÇÃO ADICIONAL: Não estou conseguindo obter nenhum tipo de métrica confiável do docker que me diga quais limites de CPU e memória ele possui para o contêiner. Pesquisas variadas indicam que os contêineres do docker não têm um limite de memória por padrão, ou têm e são 1 GB, mas tudo o que posso verificar no momento é que docker statso contêiner SQL está usando apenas entre 750 e 850 meg, e quando Eu tento adicionar um parâmetro de execução para definir a memória disponível para 4 gb, dá erro. Então parei de seguir esse segmento de consulta e fui para uma verificação de intestino diferente: entrar em uma sessão interativa do powershell no contêiner em execução e, em seguida, invocar meu script do powershell vinculado acima de dentro do contêiner.

Rodando dentro do container não houve problema. Ele atravessou 2780 objetos em apenas alguns minutos. Acho que isso confirma que o problema está no limite do contêiner/host, então vou ver se consigo abrir essa porta UDP. ATUALIZAÇÃO: Abrir a porta 1434 UDP não ajudou.


MAIS ATUALIZAÇÕES - Solução alternativa alcançada, não é um problema de restrição de recursos: parece haver problemas relacionados à configuração de grandes alocações de memória para contêineres do Windows - eu estava recebendo erros semelhantes para 3g e 2g, mas finalmente consegui iniciar o contêiner com 1,5g e Eu vi uma diferença no docker statscontêiner que (eu acho) confirma que estava sendo executado com uma alocação padrão de 1 GB. Nas configurações padrão, a estatística PRIV WORKING SET (para a qual não consigo encontrar nenhuma documentação, mas meu melhor palpite é que é RAM) está entre 700MiB e 850MiB. Comdocker run —memory="1.5g"definido, é em torno de 1.0GiB. Então, ele se expandiu, mas parece estar deixando mais alocação livre do que antes. Eu interpreto isso (talvez incorretamente) como significando que este servidor (que está executando absolutamente NENHUMA carga e NÃO possui bancos de dados de usuários) não está sob pressão de memória. Verifiquei a configuração de memória máxima do servidor para confirmar que ela está definida no máximo padrão de 2PiB.

Então as coisas ficaram estranhas. Ainda estou testando as coisas executando meu script powershell de vários locais. Rápido dentro do container, lento no host. Então eu fiz RDP para outra máquina Windows na rede e executei o script dessa máquina, conectando-me ao meu host Windows 10 por IP. E foi RÁPIDO! Isso parece apoiar a teoria de que, ao se conectar a algo que deveria ser localhost, o SMO está tentando se conectar ao SQL Server usando algo diferente da porta 1433 TCP, que aguarda um tempo limite muito longo antes de retornar à conexão TCP.

Decidi tentar validar essa teoria inserindo uma entrada de arquivo hosts para se referir a localhost por um nome diferente de localhost:

        127.0.0.1       dockersucks

Eu me conectei no SSMS a dockersucks em vez de localhost ou ".", e imediatamente as coisas ficaram mais rápidas. A navegação no explorador de objetos foi como de costume, e a abertura de painéis como anexar banco de dados ou propriedades do servidor aconteceu tão rapidamente quanto o normal. E, quando executei meu script powershell do host do Windows 10 usando esse alias como nome do servidor, também foi rápido.

Adicionei essa atualização à pergunta em vez de uma resposta, pois ainda estou procurando uma explicação de por que isso está ocorrendo e se há uma maneira de corrigi-la para conexões com "localhost" com esse nome.

sql-server ssms
  • 2 2 respostas
  • 2600 Views

2 respostas

  • Voted
  1. Randolph West
    2018-02-10T08:55:36+08:002018-02-10T08:55:36+08:00

    Este é provavelmente um problema de fome de RAM.

    Coisas para verificar:

    • O contêiner tem 4 GB de RAM atribuídos a ele? Verifique esta resposta .
    • Você configurou a configuração Max Server Memory para SQL Server dentro do contêiner? Dependendo da quantidade de RAM que o SQL Server pode ver no contêiner, isso pode ser definido como algo de 1 GB a 3,25 GB.
    • A RAM do seu host está esgotada e é possível que o Docker esteja paginando para o disco? Feche todos os aplicativos estranhos (navegadores da Web são grandes consumidores de RAM). O SSMS precisa de cerca de 1 GB de RAM de trabalho para ser utilizável.
    • Isso é mais rápido após uma reinicialização?

    Se eu estivesse fazendo isso sozinho, instalaria o Docker Community Edition para Windows da loja do Docker e, em seguida, instalaria a imagem do SQL Server Docker dessa maneira.

    Se sua conexão com a Internet for rápida o suficiente, você poderá começar a funcionar em menos de 5 minutos e alocar recursos de maneira muito mais fácil.

    EDIT: Ah, rede.

    • 3
  2. Best Answer
    NReilingh
    2018-02-10T13:14:12+08:002018-02-10T13:14:12+08:00

    A principal diferença aqui é se o SSMS/SMO está tentando se conectar com IPv4 ou IPv6. Se você fizer um ping localhostem um prompt de comando, deverá vê-lo resolver para ::1, que é o equivalente IPv6 de 127.0.0.1. Conectar-se a .faz a mesma coisa.

    Seu docker runcomando expõe apenas a porta 1433 no 127.0.0.1. Você pode verificar isso executando netstat -apara ver quais portas estão disponíveis.

    O alias do arquivo hosts que você criou resolve diretamente para 127.0.0.1, mas você não precisa dele, pois pode se conectar 127.0.0.1diretamente no SSMS e resolver seu problema dessa maneira. Desativar o IPv6 inteiramente no seu sistema host provavelmente também funcionaria, mas não tenho certeza de quão aconselhável isso é no Windows 10.

    Vou considerar uma resposta alternativa para aceitar se alguém puder me dizer por que o IPv6 está causando isso.

    • 3

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve