contenções no sgbd microsoft sql server 2008 r2

Propaganda
CONTENÇÕES NO SGBD MICROSOFT SQL SERVER 2008 R2
ROMULO RUBENS CUNHA JUNIOR 1
IREMAR NUNES DE LIMA 2
Resumo: Este artigo aborda os tipos de contenções que podem ocorrer no Sistema
Gerenciador de Banco de Dados Microsoft SQL Server 2008 R2. Estas contenções geram
waits (esperas) e afetam diretamente o desempenho de uma instância SQL Server. Será
mostrado como um Administrador de Banco de Dados (DBA) pode identificar estas
contenções e o que deve fazer para minimizar o problema.
Palavras-chave: SQL Server 2008, Banco de Dados, Contenção, Waits.
1 INTRODUÇÃO
Existem vários tipos de contenções que podem ocorrer no SQL Server como, por exemplo:
contenções de I/O, por concorrência, de rede e por configurações incorretas.
As contenções podem trazer vários problemas para aos DBAs pelo o fato de nem sempre
serem de fácil resolução e ter um custo relativamente alto. Por isso, sempre que se pensar em
adquirir um SQL Server deve-se fazer um levantamento de tudo que ira precisar desde a parte
de Hardware até as instâncias que serão instaladas e suas configurações, evitando assim o
1 Especialista em Banco de Dados e Business Inteligence ([email protected]).
2 DBA, mestre em informática e professor do Centro Universitário Newton Paiva ([email protected]). máximo possível de contenções devido a um Banco de Dados mal instalado ou por causa de
uma configuração errada no servidor. As contenções não acontecem apenas na instalação do
banco, elas podem acontecer em vários momentos como, por exemplo, em códigos SQLs mal
formulados.
Desta forma, é importante investigar os waits de um servidor de banco de dados, para
conseguir evitar as contenções que podem ocorrer e para saber o que fazer quando o tempo de
contenção é muito grande ou até mesmo quando acontece o travamento do sistema. Este
artigo aborda alguns tipos de contenções que podem acontecer no SQL Server 2008.
2. TIPOS DE CONTENÇÃO (WAIT)
Existem três tipos de contenções que podem acontecer em um banco de dados. as esperas de
recursos, as esperas de fila e as esperas externas (MSDN, 2011).
•
Esperas de recursos: ocorrem quando é solicitado um acesso a um recurso que no
momento está sendo utilizado e por isto não está disponível ou ainda não foi
disponibilizado. Alguns exemplos que se pode dar de esperas de recurso são: bloqueios
(locks) e espera de I/O de disco.
•
Esperas de fila: acontecem quando uma tarefa está inativa, pois está esperando que lhe
seja atribuído a algum trabalho. Este tipo de tarefa normalmente é vista como tarefas de
segundo plano de sistema, como por exemplo monitor de deadlocks e tarefas de limpeza.
Essas tarefas aguardam as solicitações para serem colocadas em uma fila de trabalho. Este
tipo de espera pode ficar ativo periodicamente mesmo que nenhum outro novo pacote
tenha sido colocado na fila.
•
Esperas Externas: ocorrem quando o SQL Server está aguardando o término de um
evento externo como o extended stored procedures call (chamada de procedimento de
armazenamento estendido) ou o Linked Server Query (Consulta de servidor vinculada).
Lembrando que quando é diagnosticado um problema desse tipo de espera, nem sempre
quer dizer que a tarefa está parada, pois ele pode estar executando algum código externo.
3. ENCONTRANDO WAITS NO SQL SERVER 2008 R2
Sempre que uma query roda e acontece algum tipo de espera, o SQL Server registra os
detalhes sobre o tipo de espera que podem ser observados através da view
SYS.DM_OS_WAITS_STATS. Com esses detalhes pode-se examinar a causa de todas as
contenções. Existem vários tipos diferentes de contenções e a cada atualização do SQL Server
são lançados alguns novos tipos de waits, por isso, é sempre importante enxugar um pouco
quando se vai procurar pelas esperas mais altas. O comando a seguir mostra as dez esperas
que está acontecendo numa instância SQL Server 2008 ordenado por tempo de espera.
Um exemplo de resposta seria:
Como resultado foi listado o tipo de espera classificando-o pelo tempo total. Na pesquisa no
banco de dados apareceu o tipo LOGMGR_QUEUE com o tempo mais alto. O SQL Server
possui como recurso uma procedure para limpar o conteúdo das waits, conforme mostra
figura a seguir, o que se torna excelente para uma análise comparativa. Isto permite ver com
mais segurança onde está acontecendo o maior tipo de contenção.
4. TIPOS MAIS COMUNS DE WAITS
A
seguir
será
analisado
os
tipos
de
contenções
mais
encontradas
na
view
SYS.DM_OS_WAIT_STATS.
4.1 Locks (Bloqueios)
Os LCK_XX são waits que estão relacionados com bloqueios e travamentos. Quando existe
uma contenção muito grande nestes tipos de waits, significa que alguma coisa está impedindo
a execução eficiente dos mecanismos de travamento da engine de armazenamento. Isto pode
acontecer devido às transações estarem muito grandes ou por uma falta de índices adequados,
o que resultaria no bloqueio ou na leitura de mais linhas do que necessário, aumentando assim
o tempo de duração e chances de bloqueios. A configuração de hardware mal feita pode
contribuir para uma espera muito alta no LCK_XX, pois cada ação levará mais tempo para
poder ser concluída. MSQL_XP acontece quando o SQL Server esta a espera de uma store
procedure finalizar, isto pode indicar algum erro no código da sua procedure (ANDREW,
2011).
4.2 Latchs (Travas)
O LATCH_xx e o PAGELATCH_xx são waits que não estão relacionados as atividades
físicas do I/O. As waits LATCH_XX são típicas contenções de recursos internos ou outra
estrutura de buffer pool, especialmente quando estiver usando tipos de dados (text) ou heaps
(pilhas). Comparar o problema associando outros tipos de waits geralmente é importante ao
invés de tratar os LATCHs sozinhos. PAGELATCH_XX são waits que estão ligados
diretamente à contenção na memória cache, incluindo o buffer pool. Uma espera muito alta
pode estar relacionada a vários problemas. Um problema comum é uma pequena quantidade
de memória ou uma memória mal distribuída, o que causa uma grande contenção para páginas
que estão no cache. Nestes casos o ideal é fazer a distribuição correta da memória ou
adicionar mais memória. Outro problema que pode ocorrer é um grande número de inserções
no mesmo intervalo de páginas, especialmente quando resulta em uma divisão de páginas
(split). O problema pode ser ainda maior se houverem muitos SELECTs no mesmo intervalo
de páginas o que é difícil de acontecer devido a exigência de um número muito grande de
transações por segundo. Para resolver este problema tem que se fazer alguns ajustes nos
índices. A PAGELATCH_UP é uma wait que acontece quando uma tarefa está esperando por
desbloqueio de buffer. Geralmente acontece no banco de dados TEMPDB quando este está
muito sobrecarregado. Pode-se resolver este problema criando mais arquivos de dados para o
TEMPDB, o que reduziria a espera ou até mesmo a eliminaria (ANDREW, 2011).
4.3 Rede
Muitas pessoas acham que os problemas de contenção de rede estão relacionados a problemas
físicos da estrutura de rede entre o cliente e o servidor, o que não é correto, apesar de afetar o
tempo de espera do NETWORKIO. O que acontece geralmente é uma falha do próprio
cliente. Por exemplo, se o cliente não consegue processar os resultados tão rápido quanto o
SQL Server, ele começará a observar este tipo de espera. O que também pode ocasionar isto é
quando se tem um aplicativo mal feito rodando e o hardware fica sobrecarregado do lado do
cliente (ANDREW, 2011).
4.4 I / O
As waits IO_COMPLETION, WRITELOG, PAGEIOLATCH_XX e LOGMGR são tipos de
esperas que se encaixam na categoria de I/O. A IO_COMPLETION significa que o sistema
está esperando I/O para a tarefa poder finalizar. A WRITELOG acontece quando está
aguardando a transação de log ser concluída. O que pode causar isto é a freqüência dos pontos
de
verificações
(CHEKPOINT)
e
confirmações
de
transações
(COMMITS).
As
PAGEIOLATCH_XX são waits específicas relativas a transferências do disco para memória,
e quase sempre indica problemas com o subsistema de disco. O subsistema não está
conseguindo acompanhar o volume de solicitações de I/O LOGMGR: este tipo de wait
acontece quando uma tarefa está a espera de algum log pendente de I/O antes de finalizar o
log e fechar o banco de dados. Quando estão envolvidos alguns desses waits é um forte
indicador que o gargalo é no I/O . Temos também o LOGMGR_QUEUE que ocorre quando a
tarefa
de
gravador
de
log
aguarda
uma
solicitação
de
trabalho.
O
LOGMGR_RESERVE_APPEND acontece quando está esperando para verificar se o
truncamento de log vai liberar espaço para os logs, para assim poder ser gravado novos
registros de log (MSDN, 2011).
Existem algumas estratégias para poder reduzir a maioria destas esperas:
•
Ajustar suas consultas para lerem menos dados satisfazendo os pedidos.
•
Aumentar
o
tamanho
do
arquivo
de
log
para
evitar
a
espera
do
LOGMGR_RESERVE_APPEND.
•
Colocar os arquivos de log e de dados em unidades diferentes, para não haver qualquer
tipo de competição para a gravação dos mesmos nas unidades.
•
Alterar os tipos e configurações do dispositivo RAID para melhorar o desempenho (por
exemplo, adicionar mais discos, mudar a matriz de RAID 5 e RAID 10).
4.5 Paralelismo
O wait CXPACKET acontece quando tem um processamento paralelo que não está sendo
eficiente. Acontece quando o SQL Server está aguardando um ou mais processos paralelos se
completarem ou iniciarem. Os valores indicam que não se pode tirar proveito do uso de
múltiplos processadores ou de muitos processadores em paralelos. Se o tempo de espera do
CXPACKET for muito grande a ponto de se tornar um problema deve-se considerar reduzir o
grau de paralelismo (RANDAL, 2011).
5. CONCLUSÃO
As contenções (waits) podem acontecer a todo o momento no SQL Server 2008 R2, o que
pode ocasionar muita lentidão em todo banco de dados. Neste artigo foi mostrado a query
SQL para poder encontrar os waits que estão causando maior contenção no banco de dados e
aqueles que acontecem com maiores freqüência no Microsoft SQL Server 2008 R2.
Cada tipo de contenção tem uma maneira de ser tratada: o ideal é saber qual wait está
acontecendo para assim poder tratá-la de maneira adequada.
REFERÊNCIAS
ANDREW, J. KELLY. Dissecting SQL Server’s Top Waits Disponível em
<http://www.sqlmag.com/article/performance/dissecting-sql-server-s-top-waits> Acessado em
27de maio de 2011
COLLAGE,Rod. SQL Server 2008: Administration In Action. 74°. Greenwich: Ed.
MANNING, 2010.
KNOWS, PEARL by Robert Pearl. SQL Server Waits and Queues Disponivel em
<http://www.sqlservercentral.com/blogs/pearlknows/archive/2010/01/15/sql-server-waitsand-queues.aspx> acessado em 25 de maio de 2011
MSD Magazine, Microsoft. Encontrar dados ocultos para otimizar o desempenho do
aplicativo Disponível em <http://msdn.microsoft.com/pt-br/magazine/cc135978.aspx>
Acessado em 27 de maio de 2011
MSDN,
MICROSOFT
sys.dm_os_wait_stats(Transact-SQL)
Disponível
em
<http://msdn.microsoft.com/pt-br/library/ms179984.aspx> acessado em 28 de maio de 2011
RANDAL, PAUL S. Wait statistics, or please tell me where it hurts. Disponível em
<http://www.sqlskills.com/BLOGS/PAUL/post/Wait-statistics-or-please-tell-me-where-ithurts.aspx> Acesso em 27 de maio de 2011
SQL Server 2008. Disponível em: <http://social.msdn.microsoft.com>. Acesso em: 22 abril
2011.
Download