Script - Cálculo automático "Max Worker Threads".

Fala pessoal, tranquilo?




 Hoje irei compartilhar com vocês um código que pode ser útil, mas antes, se lembram desta tabelinha?





Arquitetura
Processadores lógicos
Max Worker Threads
x86
Até 4
256
x86
Mais de 4
256 + ((# Procs – 4) * 8)
x64
Até 4
512
x64
Mais de 4 e até 64
512 + ((# Procs – 4) * 16)
x64
Mais que 64
512 + ((# Procs – 4) * 32)



Obs.: A linha em amarelo foi o motivo do script presente neste post sofrer algumas alterações.



 Também utilizei ela no post que expliquei o que são as Workers no SQL Server (Veja aqui!). As fórmulas desta tabela nos dizem a quantidade de threads que o SQL Server pode criar com base na arquitetura e na quantidade de processadores lógicos disponíveis para a instância.

 Para facilitar nossa vida, criei um script que calcula a quantidade máxima de threads para uma instância do SQL Server e estou compartilhando com vocês! Segue abaixo: 



--Primeiro vamos declarar três variáveis: @@edition, @cpu e @maxwthreads.


DECLARE @@edition VARCHAR(50);
DECLARE @cpu VARCHAR(50);
DECLARE @maxwthreads INT;



/*


Vamos agora atribuir os valores as nossas variáveis, utilizando a função SERVERPROPERTY populo a variável @@edition com informações referente a edição do SQL Server. Quanto a segunda variável, @cpu, iremos popular ela com o valor obtido de uma query de contagem disparada contra a sys.dm_os_schedulers pegando apenas as cpu’s que estão visíveis a instância, 'VISIBLE ONLINE', quanto a variável @maxwthreads, iremos popular ela com o valor configurado para o parâmetro 'Max Worker Threads' nas configurações da instância, esta informação iremos capturar da sys.configurations.


Atualizado em: 05/05/2016.


*/



SET @@edition = CAST((SELECT SERVERPROPERTY ('edition')) AS VARCHAR (200))
SET @cpu = CAST((SELECT COUNT(1) FROM sys.dm_os_schedulers WHERE STATUS
collate Latin1_General_CI_AI = 'visible online') AS VARCHAR(200))
SET @maxwthreads = CAST((SELECT value FROM sys.configurations WHERE name

collate Latin1_General_CI_AI = 'max worker threads') AS VARCHAR(200))



/*


Caso o 'Max Worker Threads' esteja configurado em seu valor padrão, zero, a lógica da tabela será aplicada. Caso o valor esteja diferente de zero, ele será verificado no intuito de saber se está dentro do que a Microsoft suporta ou não.


*/


IF (@maxwthreads) = 0 AND (@@edition) LIKE '%64-bit%'


BEGIN
IF (@cpu) <= 4
SELECT 512 AS max_threads
ELSE IF (@cpu) > 4 and (@cpu) <= 64
SELECT (@cpu-4)*16+512 AS max_threads
ELSE IF (@cpu) > 64
SELECT (@cpu-4)*32+512 AS max_threads
END


ELSE IF (@maxwthreads) = 0 AND (@@edition) NOT LIKE '%64-bit%'


BEGIN
IF (@cpu) <=4
SELECT 256 AS max_threads
ELSE IF (@cpu) > 4
SELECT (@cpu-4)*8+256 AS max_threads
END


ELSE IF (@maxwthreads) > 1024 and (@@edition) NOT LIKE '%64-bit%'


BEGIN
SELECT 'O valor do Max Worker Threads está fixado em: ' +CONVERT(VARCHAR(25),@maxwthreads) +'. Este valor está acima do suportado pela Microsoft nesta plataforma que é de 2048.'
END


ELSE


BEGIN
SELECT 'O valor do Max Worker Threads está fixado em: ' +CONVERT(VARCHAR(25),@maxwthreads) +'.'
END

Valeu pessoal! Até a próxima!

Nenhum comentário:

Postar um comentário