Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Problemas de desempenho com o SQL Server 2012 Enterprise Edition sob licenciamento CAL


Várias alterações de licenciamento foram introduzidas no SQL Server 2012; o mais significativo foi a mudança do licenciamento baseado em soquete para o licenciamento baseado em núcleo para Enterprise Edition. Um dos desafios que a Microsoft enfrentou com essa mudança foi fornecer um caminho de migração para clientes que anteriormente usavam licenciamento baseado em Server+CAL para Enterprise Edition antes do SQL Server 2012. Os clientes com Software Assurance podem atualizar para o SQL Server 2012 Enterprise Edition e ainda usar o Server Licenciamento +CAL (também conhecido como "grandfathering"), mas com limitação a 20 processadores lógicos, conforme documentado no Guia de Licenciamento do SQL Server 2012. Esse licenciamento também se estende a VMs com um limite de 4 VMs cobertas pela licença Enterprise Server+CAL, mas ainda com a mesma limitação de 20 processadores lógicos conforme documentado no Guia de Licenciamento de Virtualização do SQL Server 2012.

Muitas pessoas foram pegas de surpresa pela limitação de 20 processadores lógicos, embora esteja documentada nos guias de licenciamento.

Uma entrada é feita no arquivo ERRORLOG quando a instância é inicializada, especificando o número de processadores lógicos e que a limitação de 20 processadores está sendo aplicada:
Data    14/11/2012 20:15:08
Log     SQL Server (Atual – 14/11/2012 20:17:00)
Servidor de origem
Mensagem
SQL O servidor detectou 2 soquetes com 16 núcleos por soquete e 16 processadores lógicos por soquete, totalizando 32 processadores lógicos; usando 20 processadores lógicos baseados no licenciamento do SQL Server. Esta é uma mensagem informativa; Não é necessária nenhuma ação do usuário.
Com a configuração padrão que o SQL Server aplica sob a limitação de 20 processadores lógicos usando Server+CAL, os primeiros 20 agendadores são VISÍVEIS ONLINE e quaisquer agendadores restantes são VISÍVEIS OFFLINE. Como resultado, podem ocorrer problemas de desempenho para a instância, devido a desequilíbrios do agendador de nós NUMA. Para demonstrar isso, criei uma VM em nosso servidor de teste Dell R720 que possui dois soquetes e processadores Intel Xeon E5-2670 instalados, cada um com 8 núcleos e Hyperthreading habilitado, fornecendo um total de 32 processadores lógicos disponíveis no Windows Server 2012 Datacenter Edition. A VM foi configurada para ter 32 CPUs virtuais com 16 processadores virtuais alocados em dois nós vNUMA.


Figura 1 – configurações do vNUMA

No SQL Server sob o modelo de licenciamento Enterprise Server+CAL, isso resulta em uma configuração do agendador semelhante à seguinte:
SELECT parent_node_id, [status], scheduler_id, [cpu_id], is_idle, current_tasks_count, runnable_tasks_count, active_workers_count, load_factorFROM sys.dm_os_schedulers;


Figura 2 – Atribuição do Agendador no Enterprise Server+CAL

Como você pode ver, todos os 16 processadores lógicos no primeiro nó NUMA e apenas quatro dos processadores lógicos no segundo nó NUMA são usados ​​pela instância. Isso resulta em um desequilíbrio significativo de agendadores entre os dois nós NUMA que podem levar a problemas significativos de desempenho sob carga. Para demonstrar isso, criei 300 conexões executando a carga de trabalho AdventureWorks Books Online na instância e, em seguida, capturei as informações do agendador para os agendadores VISIBLE ONLINE na instância usando a seguinte consulta:
SELECT parent_node_id, scheduler_id, [cpu_id], is_idle, current_tasks_count, runnable_tasks_count, active_workers_count, load_factorFROM sys.dm_os_schedulersWHERE [status] =N'VISIBLE ONLINE';

Um exemplo de saída dessa consulta sob carga é mostrado na Figura 3 abaixo.


Figura 3 – Agendadores sob carga com Enterprise Server+CAL

Você também pode ver esse sintoma visualmente em ferramentas de monitoramento, como o SQL Sentry Performance Advisor:


Figura 4 – Desequilíbrio NUMA conforme mostrado no SQL Sentry Performance Advisor

Esta informação mostra um desequilíbrio significativo e o desempenho será afetado como resultado. Isso é claramente evidente nas contagens de tarefas executáveis ​​para os quatro agendadores no segundo nó NUMA, que são três a quatro vezes maiores que as dos agendadores no primeiro nó NUMA. Então, qual é exatamente o problema e por que isso ocorre?

À primeira vista, você pode pensar que isso é um bug no SQL Server, mas não é. Isso é algo que ocorre por design, embora eu duvide que esse cenário fosse esperado quando a limitação de 20 processadores lógicos foi implementada originalmente. Em sistemas baseados em NUMA, novas conexões são atribuídas aos nós NUMA de forma round-robin e, em seguida, dentro do nó NUMA, a conexão é atribuída a um agendador com base na carga. Se mudarmos a maneira como estamos vendo esses dados e agregar os dados com base em parent_node_id, veremos que as tarefas estão realmente sendo balanceadas nos nós NUMA. Para fazer isso, usaremos a consulta a seguir, cuja saída é mostrada na Figura 5.
SELECT parent_node_id, SUM(current_tasks_count) AS current_tasks_count, SUM(runnable_tasks_count) AS runnable_tasks_count, SUM(active_workers_count) AS active_workers_count, AVG(load_factor) AS avg_load_factorFROM sys.dm_os_schedulersWHERE [status] =N'VISIBLE ONLINE'GROUP BY parent_node_id; 

Figura 5 – Balanço round-robin do nó NUMA

Esse comportamento está documentado nos Manuais Online para SQL Server (http://msdn.microsoft.com/en-us/library/ms180954(v=sql.105).aspx). Sabendo o que sei sobre SQLOS, SQL Server e hardware, isso faz sentido. Antes da limitação de 20 processadores lógicos no SQL Server 2012 Enterprise Edition com licenciamento Server+CAL, era um cenário raro que o SQL Server tivesse um desequilíbrio do agendador entre nós NUMA em um servidor de produção. Um dos problemas neste caso específico é a forma como o NUMA virtual foi passado para a VM. Realizar exatamente a mesma instalação no hardware físico permite que todos os escalonadores sejam VISÍVEIS ONLINE, uma vez que os processadores lógicos adicionais apresentados pelos hyperthreads são distinguíveis por SQL e gratuitos.

Em outras palavras, o limite de 20 processadores lógicos na verdade resulta em 40 agendadores ONLINE se (a) não for uma máquina virtual, (b) os processadores forem Intel e (c) o hyper-threading estiver ativado. forte>

Então, vemos esta mensagem no log de erros:
Data    14/11/2012 22:36:18
Log     SQL Server (Atual – 14/11/2012 22:36:00)
Servidor de origem
Mensagem
SQL O servidor detectou 2 soquetes com 8 núcleos por soquete e 16 processadores lógicos por soquete, totalizando 32 processadores lógicos; usando 32 processadores lógicos baseados no licenciamento do SQL Server. Esta é uma mensagem informativa; Não é necessária nenhuma ação do usuário.
E a mesma consulta acima resulta em todos os 32 processadores sendo VISÍVEIS ONLINE:
SELECT parent_node_id, [status], scheduler_id, [cpu_id], is_idle, current_tasks_count, runnable_tasks_count, active_workers_count, load_factorFROM sys.dm_os_schedulersWHERE [status] =N'VISIBLE ONLINE';


Figura 6 – Mesma configuração em hardware físico

Nesse caso, como existem apenas 32 processadores lógicos, o limite de 20 (bem, 40) núcleos não nos afeta em nada e o trabalho é distribuído uniformemente por todos os núcleos.

Em cenários em que a limitação de 20 processadores afeta o equilíbrio NUMA de agendadores, é possível alterar manualmente a configuração do servidor para equilibrar o número de agendadores VISIBLE ONLINE em cada um dos nós NUMA através do uso de ALTER SERVER CONFIGURATION . No exemplo de VM fornecido, o comando a seguir configurará os primeiros 10 processadores lógicos em cada nó NUMA para VISIBLE ONLINE.
ALTER SERVER CONFIGURATIONSET PROCESS AFINITY CPU =0 a 9, 16 a 25;

Com essa nova configuração, executando a mesma carga de trabalho de 300 sessões e a carga de trabalho do AdventureWorks Books Online, podemos ver que o desequilíbrio de carga não ocorre mais.


Figura 7 – Saldo restaurado com configuração manual

E, novamente, usando o SQL Sentry Performance Advisor, podemos ver a carga da CPU distribuída de forma mais uniforme em ambos os nós NUMA:


Figura 8 – Balanço NUMA conforme mostrado no SQL Sentry Performance Advisor

Esse problema não se limita estritamente às VMs e à forma como as CPUs virtuais são apresentadas ao SO. Também é possível encontrar esse problema com hardware físico. Por exemplo, um Dell R910 mais antigo com quatro soquetes e oito núcleos por soquete, ou mesmo um servidor baseado em AMD Opteron 6200 Interlagos com dois soquetes e 16 núcleos por soquete, que se apresenta como quatro nós NUMA com oito núcleos cada. Em qualquer uma dessas configurações, o desequilíbrio do processo também pode resultar em um dos nós NUMA sendo totalmente configurado offline. Consequentemente, outros efeitos colaterais, como a distribuição da memória desse nó pelos nós online, levando a problemas de acesso à memória externa, também podem prejudicar o desempenho.

Resumo


A configuração padrão do SQL Server 2012 usando o licenciamento Enterprise Edition para Server+CAL não é ideal em todas as configurações de NUMA que possam existir para o SQL Server. Sempre que o licenciamento do Enterprise Server+CAL estiver sendo usado, a configuração do NUMA e os status do agendador por nó NUMA precisam ser revisados ​​para garantir que o SQL Server esteja configurado para um desempenho ideal. Esse problema não ocorre no licenciamento baseado em núcleo, pois todos os agendadores são licenciados e VISÍVEIS ONLINE.