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:
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.
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?
Respostas:
Suas opções para ter uma boa imagem da situação quando tudo estiver rastreando:
E boa sorte investigando os problemas :-).
fonte
É provável que seu problema seja o desempenho ruim da consulta causado por
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
fonte
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!
fonte
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.
fonte
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.
fonte