Eu tenho um servidor virtual executando o SQL Server 2016 (4 vcores) onde na maioria das vezes há um comprimento de fila do processador de 4 (às vezes até 15), mas a CPU está usando 25% em média. Existem cerca de 3000 lotes/s.
Usando uma consulta encontrada em um artigo de Glenn Berry encontrado no SQLSkills.com, descobri que existe um avg_task_count
de 15 e um avg_runnable_task_count
de 2 (mas não constantemente):
SELECT AVG(current_tasks_count) AS [Avg Task Count],
AVG(work_queue_count) AS [Avg Work Queue Count],
AVG(runnable_tasks_count) AS [Avg Runnable Task Count],
AVG(pending_disk_io_count) AS [Avg Pending DiskIO Count]
FROM sys.dm_os_schedulers WITH (NOLOCK)
WHERE scheduler_id < 255 OPTION (RECOMPILE);
É correto dizer que o tamanho da fila do processador e o avg_task_count
são uma indicação de que há muitas solicitações e o servidor tem problemas para processá-las? Mas o que eu não entendo é por que o uso da CPU não é maior?
O host físico tem um uso de CPU de 25%, não há reserva de memória, mas não há comprometimento excessivo de memória no host.
Embora as recomendações abaixo possam não reduzir especificamente o comprimento da fila do processador abaixo de 4 em uma VM de 4 CPUs, elas ajudarão no desempenho geral, e é provavelmente por isso que você está fazendo sua pergunta.
As práticas recomendadas publicadas pela VMware e pela Microsoft recomendam explicitamente que você defina uma reserva de CPU e uma reserva de memória para qualquer VM que execute o SQL Server.
Consulte Architecting Microsoft SQL Server on vSphere - Best Practices Guide by VMware para obter todos os detalhes sobre como fazer o SQL Server funcionar de forma confiável com o melhor desempenho possível.
Eu sei que você não está usando o produto Hyper-V da Microsoft, mas para futuros usuários que possam ver esta postagem, consulte Executando o SQL Server com memória dinâmica Hyper-V para obter suas recomendações.
As recomendações específicas para obter o melhor desempenho do SQL Server incluem:
Configure a "memória máxima do servidor" para uma configuração que faça sentido para o seu ambiente. Esta postagem pode ajudá-lo a determinar o que deve ser definido.
Certifique-se de definir "min server memory" para um valor que faça sentido. Para SQL Servers de produção, é "típico" definir isso para o mesmo valor de "memória máxima do servidor" ou para um valor 1 ou 2 GB inferior à memória máxima do servidor, caso o sistema operacional sofra extrema pressão de memória.
Configure a conta de serviço usada pelo SQL Server com o direito "Bloquear páginas na memória". Veja este post para detalhes.
Certifique-se de ter pelo menos 2 núcleos configurados para a VM. Você provavelmente quer muito mais do que 2, mas configurar a VM com um único núcleo é uma receita para o desastre. Para instalações de produção do SQL Server, recomendo pelo menos 8 núcleos.
No Hyper-V, configure a VM para reconhecer NUMA e desative a "Memória Dinâmica". Muitos servidores rejeitarão essa sugestão, pois ela reduz o número de VMs que podem ser executadas em um único servidor host; no entanto, é fundamental para o bom desempenho de qualquer serviço que precise consistentemente de muita memória, como um sistema de gerenciamento de banco de dados. No VMWare, configure a VM com uma reserva de memória que corresponda à quantidade total de memória atribuída à VM. Isso impede que o driver de balão VMware consuma memória na VM, o que, por sua vez, reduziria a memória disponível para o SQL Server e, portanto, reduziria o desempenho.
Certifique-se de usar configurar a VM com uma interface SCSI de alta fila e uma interface de rede - leia os documentos de práticas recomendadas vinculados acima para obter recomendações específicas.
Como @SqlWorldWide mencionou em um comentário sobre sua pergunta, você deve olhar para este arquivo . Extraído desse post do grupo de notícias: