Resumo
O Microsoft SQL Server 2005 utiliza o contador de CPU de alta resolução para fornecer capacidades de temporização de microssegundos. Um microssegundo é um milionésimo de segundo (ou um milésimo de milissegundo). No entanto, SQL Server valores de temporização podem estar incorretos se você usar tecnologias que alteram as frequências da CPU. Por exemplo, esse problema pode ocorrer quando você usa qualquer uma das seguintes tecnologias:
- Passo passo da CPU
- Tecnologia AMD Cool'n'Quiet
- Vários esquemas de energia
Este artigo contém métodos e informações adicionais para ajudá-lo a contornar este problema.
Sintomas
Quando você usa a instrução SET STATISTICS TIME para exibir tempos de execução, análise e compilação do servidor, você pode obter valores incorretos. Por exemplo, poderá reparar que o tempo decorrido do tempo de execução do SQL Server é muito superior ao tempo da CPU. Este problema pode afetar a precisão da otimização do desempenho. Esse problema ocorre quando você usa uma das tecnologias listadas na seção "Resumo" no servidor.
Causa
Este problema ocorre porque as frequências da CPU são alteradas quando utiliza estas tecnologias. SQL Server 2005 usa o contador de CPU de alta resolução para fornecer recursos de temporização de microssegundos. Se as frequências da CPU forem alteradas para conservar energia e reduzir a potência calorífica, as durações calculadas podem estar incorretas.
Resolução
Informações do service pack
Para resolver este problema, obtenha o service pack mais recente para o SQL Server 2005. Para mais informações, clique no número de artigo que se segue para ver o artigo na Base de Dados de Conhecimento Microsoft:
913089 Como obter o service pack mais recente para o SQL Server 2005
Observação No SQL Server 2005 Service Pack 3 e em service packs posteriores, o carimbo de data/hora do processador não é usado. Estas versões do SQL Server 2005 utilizam um temporizador mais fiável com uma precisão máxima de 1 milissegundo.
Estado
Este problema foi corrigido pela primeira vez no SQL Server 2005 Service Pack 3.
Solução
SQL Server 2005 requer pontos de dados conhecidos e estáveis para realizar um ajuste preciso do desempenho. Se os ajustes dinâmicos de frequência da CPU estiverem ativados no computador, você poderá desativá-los para que as CPUs mantenham uma taxa de frequência estável antes de começar a monitorar e ajustar o desempenho SQL Server. Para fazer isso, use os seguintes métodos.
Configure o esquema de energia no computador para forçar as CPUs a permanecerem na frequência máxima
Para fazê-lo, siga estes passos:
Clique em Iniciar , clique em Executar , digite Powercfg.cpl e, em seguida, clique em OK .
Na caixa de diálogo Propriedades de Opções de Energia , clique em Sempre Ligado na lista Esquemas de energia .
Clique em OK.
Pode ocorrer um desvio. Um desvio é uma divergência entre os valores de frequência da CPU. Para mais informações, consulte a secção "Deriva". Neste caso, tem de reiniciar o Microsoft Windows para ressincronizar as frequências de todas as CPUs depois de alterar o esquema de energia.
Se não for possível reiniciar o computador, ative SQL Server afinidade de processador para impedir que SQL Server threads de trabalho se movam entre CPUs. Quando você fizer isso, você não precisa reiniciar o computador, mesmo se ocorrer uma divergência entre os valores de freqüência da CPU. Para habilitar SQL Server afinidade de processador para todas as CPUs no servidor, você deve usar uma máscara diferente, dependendo do número de processadores lógicos que estão no servidor.
A tabela seguinte lista cenários de exemplo.
| Número da CPU | Instruções para ativar a afinidade do processador |
|---|---|
| 02 CPUs | exec sp_configure 'máscara de afinidade', 0x00000003 GO reconfigurar GO |
| 04 CPUs | exec sp_configure 'máscara de afinidade', 0x0000000F GO reconfigurar GO |
| 08 CPUs | exec sp_configure 'máscara de afinidade', 0x000000FF GO reconfigurar GO |
| 16 CPUs | exec sp_configure 'máscara de afinidade', 0x0000FFFF GO reconfigurar GO |
| 32 CPUs | exec sp_configure 'máscara de afinidade', 0xFFFFFFFF GO reconfigurar GO |
Observação Pode ser insuficiente desabilitar os recursos de variação de freqüência da CPU no nível do BIOS. Vários utilitários de terceiros podem alterar as frequências da CPU. Algumas implementações permitem ajustes de frequência mesmo quando as CPUs estão sob as configurações de esquema de energia máxima. Nesse caso, você deve desabilitar esses utilitários de terceiros quando executar o ajuste de desempenho no SQL Server 2005.
Utilize utilitários e controladores de terceiros para sincronizar as frequências e os contadores de relógio da CPU
Em raras ocasiões, um sistema pode exigir uma atualização do fabricante para corrigir problemas de frequência da CPU. É uma prática recomendada verificar o sistema para obter as atualizações mais recentes de BIOS, microcódigo e firmware se suspeitar que o sistema possa ter um problema.
Mais Informações
O Microsoft SQL Server 2000 e versões anteriores do SQL Server utilizam os mecanismos de temporização do Windows. Os mecanismos de temporização utilizam valores de precisão de milissegundos. Normalmente, esta precisão é de 10 a 15 ms. No entanto, a precisão pode ser tão grande quanto 55 ms. SQL Server consultas são geralmente concluídas em intervalos de tempo de milissegundos ou microssegundos de um só dígito. Esta precisão requer um temporizador de alta resolução. Portanto, essas versões do SQL Server relatam a duração de algumas consultas como 0 ms. Por essa razão, é difícil monitorizar o desempenho e ajustar SQL Server desempenho em versões anteriores do SQL Server.
SQL Server 2005 melhora a precisão usando o contador de CPU de alta resolução para fornecer recursos de temporização de microssegundos. Quando utiliza as tecnologias listadas na secção "Resumo", os valores de temporização comunicados podem estar incorretos.
Este problema pode afetar os seguintes objetos e funcionalidades:
Eventos de rastreio:
O evento Atenção
Eventos no nó Procedimentos Armazenados
Eventos no nó TSQL
Eventos no nó Objetos
Eventos no nó Transações
Vistas de gestão dinâmica:
sys.dm_exec_query_stats
sys.dm_exec_requests
sys.dm_exec_sessions
sys.dm_io_pending_io_requests
sys.dm_os_ring_buffers
sys.dm_os_sys_info
sys.dm_io_virtual_file_stats
sys.dm_os_wait_stats
A instrução SET STATISTICS TIME
A tabela do sistema sysprocesses
Depois de instalar o SQL Server 2005 Service Pack 2 (SP2), o SQL Server regista uma mensagem de erro no registo de erros quando SQL Server deteta que os temporizadores de alta resolução não sincronizados entre as CPUs. A mensagem de erro indica que as temporizações de desempenho podem não ser precisas e os utilizadores devem utilizar os dados de desempenho com cuidado.
O texto da mensagem de erro é semelhante a uma das seguintes mensagens de erro:
Mensagem de erro 1
Nota
O contador de carimbo de data/hora da CPU no agendador id 2 não é sincronizado com outras CPUs.
Mensagem de erro 2
Nota
A frequência do carimbo de data/hora da CPU mudou de 191469 para 1794177 ticks por milissegundo. A nova frequência será utilizada
SQL Server utiliza a instrução Real Time Stamp Counter (RDTSC) para obter a contagem de ticks da CPU de 64 bits. Pode dividir este valor pela frequência da CPU para convertê-lo em valores em milissegundos. Podem ocorrer variações de temporização quando ocorre alterações ou desvios de frequência da CPU.
Passo passo da CPU
A revisão da CPU é definida como uma mudança deliberada na frequência da CPU. A revisão da CPU também pode ser conhecida como tecnologia Intel SpeedStep ou AMD PowerNow! tecnologia. Quando ocorre uma revisão da CPU, a velocidade da CPU pode aumentar ou diminuir em incrementos tão pequenos quanto 50 MHz para economizar energia e reduzir a saída de calor. As CPUs que estão dentro do mesmo nó de acesso não uniforme à memória (NUMA) não ajustam as frequências de forma independente.
A tabela a seguir ilustra como as alterações de revisão da CPU podem afetar os cálculos de temporização.
| Ação | Carrapatos RDTSC | Ticks por milissegundo (Frequência) | Hora do relógio de parede |
|---|---|---|---|
| Iniciar lote | 1 | 200 | 0 |
| Redução da frequência | 200 | 100 | 1ms |
| Terminar lote | 500 | 3ms | |
| TOTAIS | 500 | 4ms |
SQL Server captura os ticks RDTSC nos ticks RDTSC inicial e final. Em seguida, SQL Server divide os ticks pelo valor de frequência.
Neste exemplo, os seguintes cálculos de temporização ocorrem quando utiliza um valor de frequência de 200 ou 100:
Frequência 200: 500/200 = 2,5 ms
Frequência 100: 500/100 = 5 ms
Nenhum dos cálculos de temporização corresponde à hora real do relógio de parede de 4 ms.
Se este cálculo for utilizado num evento de rastreio RPC:Completed, as colunas de dados de duração e hora de fim são reportadas incorretamente. O evento RPC:Completed captura a hora do relógio de parede inicial e a contagem de ticks da CPU. Para obter um tempo de resolução mais alto do que os fornecidos pelo Windows no SQL Server 2005, as colunas de dados de duração e hora de término em um rastreamento de SQL Server são calculadas usando a contagem de ticks da CPU decorrida. A coluna de hora de fim é calculada adicionando a coluna de duração à coluna de hora de início. Neste exemplo, a coluna de hora de fim é calculada adicionando incorretamente 2,5 ms ou 5 ms à hora de início.
Deriva
Desvio é uma divergência nos valores de clock da CPU. Os sistemas que têm várias CPUs podem produzir diferentes valores de clock da CPU para o mesmo ponto no tempo. Embora não seja comum, as CPUs podem enfrentar separação de relógio ao longo do tempo.
O exemplo a seguir demonstra como as alterações de desvio podem afetar o resultado da coluna de dados de duração em um rastreamento de SQL Server. O exemplo assume que a frequência da CPU permanece estável em 200 ticks por milissegundo. A tabela seguinte ilustra os eventos neste cenário.
| Ação | CPU agendada do Windows | CPU 1 RDTSC | CPU 2 RDTSC | Hora do relógio de parede |
|---|---|---|---|---|
| Iniciar lote | 1 | 100 | 1100 | 0 |
| Terminar lote | 2 | 900 | 1900 | 4 ms |
| TOTAIS | 4 ms |
SQL Server captura os ticks RDTSC nos pontos iniciais e finais. Em seguida, SQL Server divide os ticks RDTSC pelo valor de frequência. Neste exemplo, o Windows agendou o thread de trabalho SQL Server em duas CPUs diferentes. O thread de trabalho SQL Server que atende o lote foi executado pela primeira vez na primeira CPU (CPU 1).
No entanto, a execução do lote foi interrompida em algum momento, e SQL Server enviou a execução do lote para a fila pendente. Quando SQL Server enviou novamente o thread de trabalho SQL Server que atende esse lote para a fila executável, o Windows despachou o thread para ser executado na segunda CPU (CPU 2). O thread de trabalho de SQL Server foi concluído e executado na CPU 2. Devido ao desvio da CPU, o valor de tick final capturado da CPU 2 foi 1900 em vez de 900. Pode evitar este comportamento se ativar SQL Server afinidade de processador.
Neste exemplo, são utilizados os seguintes cálculos de temporização:
- O valor incorreto, mas relatado: (1900 – 100 = 1800) / 200 = 9 ms
- Valor correto: (900 – 100 = 800) / 200 = 4 ms
O valor da coluna de duração para o evento RPC:Completed seria comunicado como 9 ms em vez de 4 ms. Este resultado é mais do dobro do valor correto de 4 ms.
Mensagens de aviso de desvio são adicionadas ao SQL Server 2005 para indicar que as saídas de desempenho mencionadas anteriormente podem não ser confiáveis. Em algumas situações descobertas, o SQL Server 2005 SP2 pode relatar mensagens de aviso sobre o seguinte:
- Mensagens de aviso de desvio falso
- O desvio pode tornar-se dezenas de milissegundos sem causar um efeito de sistema perceptível
Tem de ter cuidado ao avaliar as saídas relacionadas com o desempenho e ao comparar as saídas relacionadas com o desempenho com as temporizações de relógio de parede. Se não existirem sinais de outros problemas de desempenho, normalmente pode ignorar as mensagens de aviso de desvio. Por exemplo, normalmente você pode ignorar as mensagens de aviso de desvio nas seguintes situações:
- Os processos estão a decorrer conforme esperado.
- SQL Server consultas não estão a ser executadas com padrões de duração estranhos.
- Não vê sinais de outros estrangulamentos.
No entanto, antes de ignorar as mensagens de aviso de desvio, recomendamos que contacte o fabricante para se certificar de que não existem problemas de RDTSC conhecidos.
Pode utilizar o sinalizador de rastreio 8033 (–T8033) para voltar ao comportamento de relatório na versão original do SQL Server 2005 e no SQL Server 2005 SP1. A versão original do SQL Server 2005 e do SQL Server 2005 SP1 não relata mensagens de aviso de desvio. Se estiver a executar a versão original do SQL Server 2005 ou do SQL Server 2005 SP1 sem problemas, normalmente pode ignorar as mensagens.
Por que a instrução WAITFOR DELAY funciona corretamente? E quanto aos processos periódicos do sistema?
Os mecanismos de tempo limite não são afetados pelo design de alta resolução. SQL Server não utiliza o temporizador de alta resolução para atividades baseadas no temporizador. Algumas atividades de tempo limite baseiam-se no temporizador de resolução reduzida que utiliza a função GetTickCount. Estas atividades de tempo limite incluem o tempo limite de bloqueio, a instrução WAITFOR DELAY e a deteção de impasse.
Para obter mais informações, clique nos números de artigo que se seguem para ver os artigos na Base de Dados de Conhecimento Microsoft:
938448 Um servidor baseado no Windows Server 2003 pode sofrer desvio do contador de carimbo de data/hora se o servidor usar processadores AMD Opteron dual-core ou processadores AMD Opteron multiprocessador
895980 Programas que usam a função QueryPerformanceCounter podem ter um desempenho ruim no Windows Server 2003 e no Windows XP
Os produtos de terceiros que este artigo aborda são fabricados por empresas que são independentes da Microsoft. A Microsoft não estabelece garantias, implícitas ou de outro tipo, relativamente ao desempenho ou fiabilidade destes produtos.