desempenho de simultaneidade do servidor sql

8

Encontramos um problema de desempenho em nosso ambiente de produção.

descobrimos que quando as sessões ativas sobem acima de 25, o uso da CPU chega a 100% e leva muito tempo para ser desativado.


O ambiente que temos:

Produto Microsoft SQL Server Enterprise Edition 9.3 (sp2)

CPUs 2 (Xeon 2.13)

Memória 7G

instantâneo da sessão detail1

Sessões ativas 25

Transações ativas 496

Sessões ociosas 289

Transações bloqueadas 29

instantâneo da sessão detail2

Sessões ativas 59

Transações ativas 885

Sessões ociosas 267

Transações bloqueadas 49


Eu gostaria de saber:

  1. se 2CPUs podem manipular bem 25 sessões ativas (500 transações ativas). PS: testamos que, sem solicitação de simultaneidade, uma transação, que lê / grava 5 tabelas, leva cerca de 1 segundo no nível do aplicativo.

  2. se as transações bloqueadas levam mais uso de CPU.PS: as transações bloqueadas são principalmente devido a bloqueios em 2 tabelas.

qual é a solução: adicionar CPUs ou aplicativo de ajuste (java / hibernate) para encurtar essa transação e diminuir os blocos na tabela?


fonte
11
O que mais está acontecendo no servidor? É um SQL Server dedicado? 7 GB não é ótimo, mas já vi coisas piores.
9786 Thomas Stringer

Respostas:

6

Suas opções para ter uma boa imagem da situação quando tudo estiver rastreando:

  • use rastreamentos do servidor para ver as sessões mais longas e pesadas
  • use o procedimento armazenado Who is Active de Adam Machanic - para salvar as informações dos momentos em que o servidor é carregado - script gratuito fantástico
  • use o Activity Monitor do Management Studio apenas para obter uma visão visual (a CPU e a IO são as que eu achei mais úteis) - ferramenta muito boa incluída no Management Studio
  • use uma ferramenta gratuita de terceiros - Confio Ignite Free - que é muito boa para momentos em que tudo fica lento e precisa ver detalhes sobre as estatísticas de espera, bloqueio ... etc. - ferramenta gratuita fantástica
  • verifique as estatísticas para estar atualizado
  • verificar se os índices estão fragmentados e, se houver, desfragmentá-los
  • siga os outros conselhos de verificação de índices ausentes, design
  • verifique a possibilidade de usar o nível de isolamento de captura instantânea em seu banco de dados (você tem um bloqueio alto, é bom ver se você realmente precisa do seu nível de isolamento atual)

E boa sorte investigando os problemas :-).

Marian
fonte
5

É provável que seu problema seja o desempenho ruim da consulta causado por

  • design deficiente
  • indexação ruim

Os bloqueios / bloqueios vêm de uma indexação ruim, devido ao tempo gasto na verificação de tabelas de ponta a ponta. CPU é irrelevante aqui.

Como uma solução rápida, verifique se há índices ausentes usando as informações deste artigo: http://blogs.msdn.com/b/bartd/archive/2007/07/19/are-you-using-sql-s-missing- index-dmvs.aspx

gbn
fonte
4

Eu concordo com GBN e Marian.

Para responder à sua pergunta sobre 2 CPUs que lidam com 25 solicitações: Eu tenho um sistema de 2 CPUs que suporta cerca de 750 conexões de usuários e uma média de solicitações em lote de 4K por segundo. Vários itens são importantes para mim: Design, Gerenciamento e Ajuste. Se você começar com um design ruim do seu aplicativo e banco de dados, falhará no carregamento (pense em dimensionamento).

CPU alta pode indicar pressão da memória. Você menciona que há apenas 7 GB de memória disponível para o SQL Server. Se você tiver índices com desempenho ruim (muitos índices, índices incorretos ou nenhum índice), isso fará com que o sistema pagine mais o banco de dados na memória para várias solicitações, se houver índices apropriados. Eu recomendaria criar índices hog-wild, pois os errados também o prejudicarão, pois cada um tem o potencial de exigir uma atualização no decorrer de uma operação de atualização de linha (Create-Update-Delete).

Além disso, o uso das DMVs de índice ausente exige o uso do que você sabe sobre seu aplicativo e banco de dados e não apenas a implementação de cada índice recomendado. Gostaria de verificar as entradas do blog de Kimberly Tripp sobre os índices aqui . Após a seção Índice, examinar as outras categorias pode ser útil para sua situação.

Se a atualização de 5 tabelas Java / Hibernate em uma única transação estiver fazendo as atualizações por meio de várias viagens de ida e volta ao banco de dados, você estará deixando a disputa (solicitações CRUD bloqueadas). O problema piora se o aplicativo não puder retornar ao banco de dados em tempo hábil. Enquanto estiver no aplicativo, a transação ativa associada poderá bloquear o processamento de outras solicitações e causar tempos limite de solicitações.

Adicione os dois problemas acima juntos e você começará a ter um caso desagradável de dor de cabeça por desempenho.

Reduzir o número de viagens de ida e volta ao banco de dados no contexto de uma única transação seria uma coisa muito boa a se buscar. Talvez um procedimento armazenado possa ajudar.

O restante exigirá trabalho para que seu aplicativo seja dimensionado. Você também pode considerar a memória, mas isso deve ocorrer após a conclusão de uma revisão de design e desempenho, e as alterações necessárias implementadas ao adicionar memória imediatamente mascararão seus problemas.

Siga absolutamente as sugestões que Marian esboçou.

Eu diria que você se encontrou com um desafio maravilhoso e desejo-lhe um grande sucesso!

Robert Miller
fonte
3
  1. Na minha experiência, temos o MS SQL Server 2000 com 2 CPUs e mais de 30 sessões ativas e mais de 1000 transações. Foi difícil de servidor, mas funcionou.
  2. Não tenho certeza de que os bloqueios usem mais CPU. Bloqueios e uso da CPU, na minha opinião, são dois problemas de desempenho diferentes.

Quanto à solução, primeiro você deve ter certeza de que seu principal problema é a CPU. Tente ler este problema para encontrar a fonte dos seus problemas e obter a solução apropriada. Por fim, se você puder fazer sua transação o menor possível - faça-o.

Alex_L
fonte
3

Meu primeiro pensamento é reduzir o número de transações e reduzir a quantidade de bloqueios. Você pode separar algumas transações em vários bits? Você pode extrair algumas das consultas das transações? Como Alex_l mencionou - a menor transação possível é ideal aqui.

Concordo com o gbn, adicionar índices também pode ajudar.

Outro pensamento é que eu também daria uma olhada nos seus bloqueios. Você está removendo bloqueios no nível da tabela quando atualiza apenas uma única linha? Você pode sugerir um bloqueio no nível da linha para o SQL Server. Isso resolveria muitos problemas. (É verdade que, se você tem 5 mesas, provavelmente não é esse o caso, mas apenas um pensamento.)

Finalmente, eu daria uma olhada nas suas tabelas que você está usando. Se todo mundo está bloqueando uma tabela específica, você pode mover a lógica dessa tabela para o final de sua transação? Se você puder reduzir o tempo em que mantém uma trava nessa tabela de alta demanda, isso pode ajudar.

Richard
fonte