Resumo
O Microsoft SQL Server 2005 utiliza o contador CPU de alta resolução para fornecer capacidades de tempo de microsegundo. Um microsegundo é um milionésimo de segundo (ou milésimo de milisegundo). No entanto, os valores de cronometragem do SQL Server podem estar incorretos se utilizar tecnologias que alteram as frequências de CPU. Por exemplo, esta questão pode ocorrer quando utilizar qualquer uma das seguintes tecnologias:
-
Passos do 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 esta questão.
Sintomas
Quando utilizar a declaração DE TEMPO DE DEFINIÇÃO PARA visualizar os tempos de execução, análise e compilação do servidor, poderá obter valores incorretos. Por exemplo, pode notar que o tempo decorrido do tempo de execução do SQL Server é muito mais do que o tempo de CPU. Este problema pode afetar a precisão da afinação do desempenho. Este problema ocorre quando utiliza uma das tecnologias listadas na secção "Resumo" do servidor.
Causa
Esta questão ocorre porque as frequências de CPU são alteradas quando se utilizam estas tecnologias. O SQL Server 2005 utiliza o contador CPU de alta resolução para fornecer capacidades de cronometragem de microsegundos. Se as frequências de CPU forem alteradas para conservar energia e reduzir a produção de calor, as durações calculadas podem estar incorretas.
Resolução
Informações do pacote de serviço
Para resolver este problema, obtenha o mais recente pacote de serviços para o SQL Server 2005. Para mais informações, clique no seguinte número de artigo para ver o artigo na Base de Conhecimento da Microsoft:
913089 Como obter o mais recente pacote de serviços para SQL Server 2005Nota No SQL Server 2005 Service Pack 3 e em pacotes de serviço posteriores, a marca de tempo do processador não é utilizada. Estas versões do SQL Server 2005 utilizam um temporizador mais fiável que tem 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
O SQL Server 2005 requer pontos de dados conhecidos e estáveis para realizar uma afinação de desempenho precisa. Se os ajustes dinâmicos de frequência do CPU estiverem ativados no computador, pode desativá-los para que os CPUs mantenham uma frequência constante antes de começar a monitorizar e afinar o desempenho do SQL Server. Para tal, utilize os seguintes métodos.
Configure o sistema de potência no computador para forçar os CPUs a permanecer na frequência máxima
Para tal, siga estes passos:
-
Clique em Iniciar,clique em Executar,digite Powercfg.cple, em seguida, clique em OK.
-
Na caixa de diálogo Power Options Properties, clique em Always On na lista de esquemas de potência.
-
Clique em OK.
Pode ocorrer uma deriva. Uma deriva é uma divergência entre os valores de frequência do CPU. Para mais informações, consulte a secção "Drift". Neste caso, tem de reiniciar o Microsoft Windows para ressincronizar as frequências de todos os CPUs depois de alterar o sistema de alimentação. Se não conseguir reiniciar o computador, ative a afinidade do processador SQL Server para evitar que os fios dos trabalhadores do SQL Server se movoquem entre CPUs. Quando o fizer, não terá de reiniciar o computador mesmo que ocorra uma divergência entre os valores de frequência do CPU. Para ativar a afinidade do processador SQL Server para todos os CPUs no servidor, deve utilizar uma máscara diferente, dependendo do número de processadores lógicos que estão no servidor. A tabela que se segue lista cenários de exemplo.
Número do CPU |
Declarações para permitir a afinidade do processador |
---|---|
02 CPUs |
executivo sp_configure "máscara de afinidade", 0x0000003GOreconfigureGO |
04 CPUs |
executivo sp_configure "máscara de afinidade", 0x000000FGOreconfigureGO |
08 CPUs |
executivo sp_configure "máscara de afinidade", 0x00000FFGOresconfigureGO |
16 CPUs |
executivo sp_configure "máscara de afinidade", 0x0000FFFFGOresconfigureGO |
32 CPUs |
executivo sp_configure 'máscara de afinidade', 0xFFFFFFFFGOreconfigureGO |
Nota Pode ser insuficiente para desativar as características de variação da frequência do CPU ao nível do BIOS. Vários utilitários de terceiros podem alterar as frequências de CPU. Algumas implementações permitem ajustamentos de frequência mesmo quando os CPUs estão sob as definições máximas do sistema de potência. Neste caso, deve desativar estes utilitários de terceiros quando efetuar a sintonização de desempenho no SQL Server 2005.
Utilize utilitários e motoristas de terceiros para sincronizar frequências de CPU e contadores de relógios CPU
Em raras ocasiões, um sistema pode exigir uma atualização do fabricante para corrigir problemas de frequência de CPU. É uma boa prática verificar o sistema para as mais recentes atualizações de BIOS, microcódigos e firmware se suspeitar que o sistema pode ter um problema.
Mais Informações
O Microsoft SQL Server 2000 e as versões anteriores do SQL Server utilizam os mecanismos de cronometragem do Windows. Os mecanismos de cronometragem utilizam valores de precisão milissegundo. Tipicamente, esta precisão é de 10 a 15 ms. No entanto, a precisão pode ser tão grande como 55 ms. As consultas do SQL Server são frequentemente completadas dentro de um milissegundo de um dígito ou períodos de tempo de microsegundo. Esta precisão requer um temporizador de alta resolução. Portanto, estas versões do SQL Server relatam a duração de algumas consultas como 0 ms. Portanto, é difícil monitorizar o desempenho e afinar o desempenho do SQL Server em versões anteriores do SQL Server.SQL o Server 2005 melhora a precisão utilizando o contador CPU de alta resolução para fornecer capacidades de cronometragem de microsegundo. Quando utilizar as tecnologias listadas na secção "Resumo", os valores de tempo reportados podem estar incorretos. Este problema pode afetar os seguintes objetos e características:
-
Eventos de rastreio:
-
O evento de atenção
-
Eventos no nó procedimentos armazenados
-
Eventos no nó TSQL
-
Eventos no nó objetos
-
Eventos no nó de Transações
-
-
Pontos de vista dinâmicos de gestão:
-
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 declaração de tempo de definição de estatísticas
-
A tabela do sistema sysprocesses
Depois de instalar o SQL Server 2 (SP2), o SQL Server regista uma mensagem de erro no registo de erro quando o SQL Server deteta que os temporizadores de alta resolução estão dessincronizados entre os CPUs. A mensagem de erro indica que os timings de desempenho podem não ser precisos e os utilizadores devem utilizar os dados de desempenho com cuidado. O texto da mensagem de erro assemelha-se a uma das seguintes mensagens de erro:
Mensagem de erro 1
O contador de carimbos de tempo da CPU no agendador id 2 não está sincronizado com outros CPUs.
Mensagem de erro 2
A frequência de carimbo de tempo da CPU mudou de 191469 para 1794177 carrapatos por milissegundo. A nova frequência será usada
O SQL Server utiliza a instrução do Contador de Carimbos em Tempo Real (RDTSC) para adquirir a contagem de tiquetaque cpu de 64 bits. Pode dividir este valor pela frequência cpu para converter o valor em valores milisegundos. Podem ocorrer variações de tempo quando a frequência do CPU muda ou ocorre deriva.
Passos do CPU
O passo do CPU é definido como uma mudança deliberada na frequência do CPU. Os passos do CPU também podem ser conhecidos como tecnologia Intel SpeedStep ou AMD PowerNow! Tecnologia. Quando ocorre um passo de CPU, a velocidade do CPU pode aumentar ou diminuir em incrementos tão pequenos como 50 MHz para conservar energia e reduzir a produção de calor. Os CPUs que estão dentro do mesmo nó de acesso à memória não uniforme (NUMA) não ajustam de forma independente as frequências. O quadro a seguir ilustra como as alterações de etapas do CPU podem afetar os cálculos de tempo.
Ação |
Carrapatos RDTSC |
Carrapatos por milissegundo (Frequência) |
Tempo do relógio da parede |
---|---|---|---|
Lote de Início |
1 |
200 |
0 |
Frequência Passo para baixo |
200 |
100 |
1ms |
Lote final |
500 |
3ms |
|
TOTAIS |
500 |
4ms |
O SQL Server captura os tiques RDTSC tanto no início como no fim dos tiques RDTSC. Em seguida, o SQL Server divide os carrapatos pelo valor de frequência. Neste exemplo, ocorrem os seguintes cálculos de tempo quando se 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 tempo corresponde ao tempo real do relógio de parede de 4 ms. Se este cálculo for utilizado num evento de vestígios preenchidos, as colunas de dados de duração e fim de tempo são reportadas incorretamente. O evento RPC:Concluído captura a hora do relógio de parede inicial e a contagem de tiquetaque do CPU. Para obter um tempo de resolução mais elevado do que o windows supplys no SQL Server 2005, as colunas de dados de duração e fim de tempo num vestígio do SQL Server são calculadas utilizando a contagem de tiquetaques do CPU decorrido. A coluna de tempo final é calculada adicionando a coluna de duração à coluna de tempo de início. Neste exemplo, a coluna de fim de tempo é calculada adicionando incorretamente 2,5 ms ou 5 ms à hora de início.
Deriva
Drift é uma divergência nos valores do relógio da CPU. Os sistemas que têm múltiplos CPUs podem produzir diferentes valores do relógio CPU para o mesmo ponto no tempo. Embora não seja comum, os CPUs podem experimentar a separação do relógio ao longo do tempo. O exemplo a seguir demonstra como as mudanças de deriva podem afetar o resultado da coluna de dados de duração num traço do SQL Server. O exemplo pressupõe que a frequência do CPU se mantém estável a 200 carrapatos por milissegundo. A tabela a seguir ilustra os acontecimentos neste cenário.
Ação |
CPU programado das janelas |
CPU 1 RDTSC |
CPU 2 RDTSC |
Tempo do relógio da parede |
---|---|---|---|---|
Lote de Início |
1 |
100 |
1100 |
0 |
Lote final |
2 |
900 |
1900 |
4 ms |
TOTAIS |
4 ms |
O SQL Server captura os tiques RDTSC nos pontos de partida e nos pontos finais. Em seguida, o SQL Server divide os tiques RDTSC pelo valor de frequência. Neste exemplo, o Windows agendou o fio de trabalhador do SQL Server em duas CPUs diferentes. O fio de trabalhador do SQL Server que presta serviços o lote funcionou 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 o SQL Server enviou o fio de trabalhador do SQL Server que recoloca este lote na fila runbutável, o Windows despachou o fio para funcionar no segundo CPU (CPU 2). O fio de trabalhador do SQL Server concluído em execução no CPU 2. Por causa da deriva do CPU, o valor final que foi capturado do CPU 2 foi 1900 em vez de 900. Pode evitar este comportamento se ativar a afinidade do processador SQL Server. Neste exemplo são utilizados os seguintes cálculos de tempo:
-
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:Concluído seria reportado como 9 ms em vez de 4 ms. Este resultado é mais do dobro do valor correto de 4 ms. As mensagens de aviso de deriva são adicionadas ao SQL Server 2005 para indicar que as saídas de desempenho mencionadas anteriormente podem não ser fiáveis. Em algumas situações descobertas, o SQL Server 2005 SP2 pode reportar mensagens de aviso sobre as seguintes situações:
-
Mensagens de aviso de deriva falsas
-
A deriva pode tornar-se dezenas de milissegundos sem causar um efeito visível no sistema
Deve ter cuidado ao avaliar as saídas relacionadas com o desempenho e quando comparar as saídas relacionadas com o desempenho com os tempos do relógio de parede. Se não houver sinais de outros problemas de desempenho, normalmente pode ignorar as mensagens de aviso de deriva. Por exemplo, normalmente pode ignorar as mensagens de aviso de deriva nas seguintes situações:
-
Os processos estão a decorrer como esperado.
-
As consultas do SQL Server não estão a funcionar em padrões de duração estranhos.
-
Não se vêem sinais de outros estrangulamentos.
No entanto, antes de ignorar as mensagens de aviso de deriva, recomendamos que contacte o seu fabricante para se certificar de que não existem problemas de RDTSC conhecidos. Pode utilizar o traço da bandeira 8033 (-T8033) para voltar ao comportamento de reporte na versão original do SQL Server 2005 e no SQL Server 2005 SP1. A versão original de lançamento do SQL Server 2005 e do SQL Server 2005 SP1 não reporta mensagens de aviso de deriva. Se estiver a executar a versão original de lançamento do SQL Server 2005 ou SQL Server 2005 SP1 sem problemas, normalmente pode ignorar as mensagens.
Porque é que a declaração DE ATRASO DA WAITFOR funciona corretamente? E os processos periódicos do sistema?
Os mecanismos de intervalo não são afetados pelo desenho de alta resolução. O SQL Server não utiliza o temporizador de alta resolução para atividades baseadas em temporizadores. Algumas atividades de intervalo de tempo são baseadas no temporizador de resolução reduzido que utiliza a função GetTickCount. Estas atividades de tempo de intervalo incluem tempo de bloqueio, declaração de atraso DO WAITFOR e deteção de impasse.
Para obter mais informações, clique nos seguintes números de artigos para ver os artigos na Base de Conhecimento da Microsoft:
938448 Um servidor baseado no Windows Server 2003 pode experimentar a deriva do contador de selos temporais se o servidor utilizar processadores AMD Opteron de dois núcleos ou processadores amd opteron multiprocessador
895980 Os programas que utilizam a função QueryPerformanceCounter podem ter um desempenho fraco no Windows Server 2003 e no Windows XPOs produtos de terceiros que este artigo discute são fabricados por empresas independentes da Microsoft. A Microsoft não faz qualquer garantia, implícita ou não, sobre o desempenho ou fiabilidade destes produtos.