AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 232943
Accepted
Learning_DBAdmin
Learning_DBAdmin
Asked: 2019-03-25 03:59:32 +0800 CST2019-03-25 03:59:32 +0800 CST 2019-03-25 03:59:32 +0800 CST

Configurações MAXDOP para SQL Server 2014

  • 772

Eu sei que essa pergunta já foi feita várias vezes e também tem respostas para ela, mas ainda preciso de um pouco mais de orientação sobre esse assunto.

Abaixo estão os detalhes da minha CPU do SSMS:

CPU

Abaixo está a guia CPU do gerenciador de tarefas do DB Server:

Guia CPU

Eu mantive a configuração de MAXDOPem 2 seguindo a fórmula abaixo:

declare @hyperthreadingRatio bit
declare @logicalCPUs int
declare @HTEnabled int
declare @physicalCPU int
declare @SOCKET int
declare @logicalCPUPerNuma int
declare @NoOfNUMA int
declare @MaxDOP int

select @logicalCPUs = cpu_count -- [Logical CPU Count]
    ,@hyperthreadingRatio = hyperthread_ratio --  [Hyperthread Ratio]
    ,@physicalCPU = cpu_count / hyperthread_ratio -- [Physical CPU Count]
    ,@HTEnabled = case 
        when cpu_count > hyperthread_ratio
            then 1
        else 0
        end -- HTEnabled
from sys.dm_os_sys_info
option (recompile);

select @logicalCPUPerNuma = COUNT(parent_node_id) -- [NumberOfLogicalProcessorsPerNuma]
from sys.dm_os_schedulers
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64
group by parent_node_id
option (recompile);

select @NoOfNUMA = count(distinct parent_node_id)
from sys.dm_os_schedulers -- find NO OF NUMA Nodes 
where [status] = 'VISIBLE ONLINE'
    and parent_node_id < 64

IF @NoofNUMA > 1 AND @HTEnabled = 0
    SET @MaxDOP= @logicalCPUPerNuma 
ELSE IF  @NoofNUMA > 1 AND @HTEnabled = 1
    SET @MaxDOP=round( @NoofNUMA  / @physicalCPU *1.0,0)
ELSE IF @HTEnabled = 0
    SET @MaxDOP=@logicalCPUs
ELSE IF @HTEnabled = 1
    SET @MaxDOP=@physicalCPU

IF @MaxDOP > 10
    SET @MaxDOP=10
IF @MaxDOP = 0
    SET @MaxDOP=1

PRINT 'logicalCPUs : '         + CONVERT(VARCHAR, @logicalCPUs)
PRINT 'hyperthreadingRatio : ' + CONVERT(VARCHAR, @hyperthreadingRatio) 
PRINT 'physicalCPU : '         + CONVERT(VARCHAR, @physicalCPU) 
PRINT 'HTEnabled : '           + CONVERT(VARCHAR, @HTEnabled)
PRINT 'logicalCPUPerNuma : '   + CONVERT(VARCHAR, @logicalCPUPerNuma) 
PRINT 'NoOfNUMA : '            + CONVERT(VARCHAR, @NoOfNUMA)
PRINT '---------------------------'
Print 'MAXDOP setting should be : ' + CONVERT(VARCHAR, @MaxDOP)

Ainda estou vendo altos tempos de espera relacionados ao CXPACKET. Estou usando a consulta abaixo para obter isso:

WITH [Waits] AS
(SELECT
[wait_type],
[wait_time_ms] / 1000.0 AS [WaitS],
([wait_time_ms] - [signal_wait_time_ms]) / 1000.0 AS [ResourceS],
[signal_wait_time_ms] / 1000.0 AS [SignalS],
[waiting_tasks_count] AS [WaitCount],
100.0 * [wait_time_ms] / SUM ([wait_time_ms]) OVER() AS [Percentage],
ROW_NUMBER() OVER(ORDER BY [wait_time_ms] DESC) AS [RowNum]
FROM sys.dm_os_wait_stats
WHERE [wait_type] NOT IN (
N'BROKER_EVENTHANDLER', N'BROKER_RECEIVE_WAITFOR',
N'BROKER_TASK_STOP', N'BROKER_TO_FLUSH',
N'BROKER_TRANSMITTER', N'CHECKPOINT_QUEUE',
N'CHKPT', N'CLR_AUTO_EVENT',
N'CLR_MANUAL_EVENT', N'CLR_SEMAPHORE',
N'DBMIRROR_DBM_EVENT', N'DBMIRROR_EVENTS_QUEUE',
N'DBMIRROR_WORKER_QUEUE', N'DBMIRRORING_CMD',
N'DIRTY_PAGE_POLL', N'DISPATCHER_QUEUE_SEMAPHORE',
N'EXECSYNC', N'FSAGENT',
N'FT_IFTS_SCHEDULER_IDLE_WAIT', N'FT_IFTSHC_MUTEX',
N'HADR_CLUSAPI_CALL', N'HADR_FILESTREAM_IOMGR_IOCOMPLETION',
N'HADR_LOGCAPTURE_WAIT', N'HADR_NOTIFICATION_DEQUEUE',
N'HADR_TIMER_TASK', N'HADR_WORK_QUEUE',
N'KSOURCE_WAKEUP', N'LAZYWRITER_SLEEP',
N'LOGMGR_QUEUE', N'ONDEMAND_TASK_QUEUE',
N'PWAIT_ALL_COMPONENTS_INITIALIZED',
N'QDS_PERSIST_TASK_MAIN_LOOP_SLEEP',
N'QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP',
N'REQUEST_FOR_DEADLOCK_SEARCH', N'RESOURCE_QUEUE',
N'SERVER_IDLE_CHECK', N'SLEEP_BPOOL_FLUSH',
N'SLEEP_DBSTARTUP', N'SLEEP_DCOMSTARTUP',
N'SLEEP_MASTERDBREADY', N'SLEEP_MASTERMDREADY',
N'SLEEP_MASTERUPGRADED', N'SLEEP_MSDBSTARTUP',
N'SLEEP_SYSTEMTASK', N'SLEEP_TASK',
N'SLEEP_TEMPDBSTARTUP', N'SNI_HTTP_ACCEPT',
N'SP_SERVER_DIAGNOSTICS_SLEEP', N'SQLTRACE_BUFFER_FLUSH',
N'SQLTRACE_INCREMENTAL_FLUSH_SLEEP',
N'SQLTRACE_WAIT_ENTRIES', N'WAIT_FOR_RESULTS',
N'WAITFOR', N'WAITFOR_TASKSHUTDOWN',
N'WAIT_XTP_HOST_WAIT', N'WAIT_XTP_OFFLINE_CKPT_NEW_LOG',
N'WAIT_XTP_CKPT_CLOSE', N'XE_DISPATCHER_JOIN',
N'XE_DISPATCHER_WAIT', N'XE_TIMER_EVENT')
AND [waiting_tasks_count] > 0
)
SELECT
MAX ([W1].[wait_type]) AS [WaitType],
CAST (MAX ([W1].[WaitS]) AS DECIMAL (16,2)) AS [Wait_S],
CAST (MAX ([W1].[ResourceS]) AS DECIMAL (16,2)) AS [Resource_S],
CAST (MAX ([W1].[SignalS]) AS DECIMAL (16,2)) AS [Signal_S],
MAX ([W1].[WaitCount]) AS [WaitCount],
CAST (MAX ([W1].[Percentage]) AS DECIMAL (5,2)) AS [Percentage],
CAST ((MAX ([W1].[WaitS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgWait_S],
CAST ((MAX ([W1].[ResourceS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgRes_S],
CAST ((MAX ([W1].[SignalS]) / MAX ([W1].[WaitCount])) AS DECIMAL (16,4)) AS [AvgSig_S]
FROM [Waits] AS [W1]
INNER JOIN [Waits] AS [W2]
ON [W2].[RowNum] <= [W1].[RowNum]
GROUP BY [W1].[RowNum]
HAVING SUM ([W2].[Percentage]) - MAX ([W1].[Percentage]) < 95; -- percentage threshold
GO

Atualmente CXPACKETespera é de 63% para o meu servidor:

Estatísticas de espera

Referi-me a vários artigos sobre a recomendação de especialistas e também analisei MAXDOPsugestões da Microsoft ; no entanto, não tenho certeza de qual deve ser o valor ideal para este.

Eu encontrei uma pergunta sobre o mesmo tópico aqui, no entanto, se eu for com essa sugestão de Kin, MAXDOPdeve ser 4. Na mesma pergunta, se formos com Max Vernon, deve ser 3.

Por favor, forneça sua valiosa sugestão.

Versão: Microsoft SQL Server 2014 (SP3) (KB4022619) - 12.0.6024.0 (X64) 7 de setembro de 2018 01:37:51 Enterprise Edition: Licenciamento baseado em núcleo (64 bits) no Windows NT 6.3 (Build 9600: ) (Hypervisor )

O Limite de Custo para Paralelismo é definido em 70. O CTfP foi definido em 70 após testar o mesmo para valores que variam de padrão a 25 e 50, respectivamente. Quando era padrão(5) e MAXDOPera 0, o tempo de espera era próximo de 70% para CXPACKET.

Executei sp_blitzfirstpor 60 segundos no modo especialista e abaixo está a saída para descobertas e estatísticas de espera:

sp_blitzfirst

sql-server sql-server-2014
  • 4 4 respostas
  • 2598 Views

4 respostas

  • Voted
  1. Best Answer
    Erik Darling
    2019-03-25T06:24:09+08:002019-03-25T06:24:09+08:00

    Falso

    Eis por que esse relatório de estatísticas de espera fede: ele não informa quanto tempo o servidor está ativo.

    Posso ver em sua captura de tela do tempo de CPU: 55 dias!

    Tudo bem, então vamos fazer algumas contas.

    Matemática

    Há 86.400 segundos no dia.

    SELECT (86400 * 55) seconds_in_55_days
    

    A resposta aí?4,752,000

    Você tem um total de 452,488segundos de CXPACKET.

    SELECT 4752000 / 452488 AS oh_yeah_that_axis
    

    O que lhe dá... 10 (é mais próximo de 9,5 se você fizer contas de verdade, aqui).

    Portanto, embora o CXPACKET possa ser 62% das esperas do seu servidor, ele está acontecendo apenas cerca de 10% do tempo.

    Deixe-o em paz

    Você fez os ajustes corretos nas configurações, é hora de fazer a consulta real e o ajuste do índice se quiser alterar os números de maneira significativa.

    Outras considerações

    CXPACKET pode surgir de paralelismo distorcido:

    • Mais sobre CXPACKET Waits: Paralelismo distorcido

    Em versões mais recentes, pode aparecer como CXCONSUMER:

    • CXCONSUMER é inofensivo? Não tão rápido, Tigre.

    Na ausência de uma ferramenta de monitoramento de terceiros, pode valer a pena capturar estatísticas de espera por conta própria:

    • Capturando estatísticas de espera por um período de tempo
    • Como capturar linhas de base com sp_BlitzFirst
    • 13
  2. Joe Obbish
    2019-03-25T06:26:26+08:002019-03-25T06:26:26+08:00

    As estatísticas de espera são apenas números. Se o seu servidor estiver fazendo alguma coisa, você provavelmente terá algum tipo de espera. Além disso, por definição, deve haver uma espera que terá a porcentagem mais alta. Isso não significa nada sem algum tipo de normalização. Seu servidor está ativo há 55 dias se eu estiver lendo a saída do gerenciador de tarefas corretamente. Isso significa que você tem apenas 452000/(55*86400) = 0,095 segundos de espera CXPACKETpor segundo no geral. Além disso, como você está no SQL Server 2014, suas CXPACKETesperas incluem esperas paralelas benignas e esperas acionáveis. Consulte Tornando o paralelismo acionável para obter mais detalhes. Eu não chegaria a uma conclusão que MAXDOPestá definida incorretamente com base no que você apresentou aqui.

    Eu mediria primeiro o rendimento. Existe realmente um problema aqui? Não podemos dizer como fazer isso porque depende da sua carga de trabalho. Para um sistema OLTP, você pode medir as transações por segundo. Para um ETL, você pode medir as linhas carregadas por segundo e assim por diante.

    Se você tiver um problema e o desempenho do sistema precisar ser melhorado, eu verificaria a CPU durante os momentos em que você tiver esse problema. Se a CPU for muito alta, você provavelmente precisará ajustar suas consultas, aumentar os recursos do servidor ou reduzir o número total de consultas ativas. Se a CPU estiver muito baixa, talvez seja necessário ajustar novamente suas consultas, aumentar o número total de consultas ativas ou pode haver algum tipo de espera responsável.

    Se você optar por examinar as estatísticas de espera, deverá examiná-las apenas durante o período em que estiver enfrentando um problema de desempenho. Observar as estatísticas globais de espera nos últimos 55 dias simplesmente não é acionável em quase todos os casos. Ele adiciona ruído desnecessário aos dados que dificultam seu trabalho.

    Depois de concluir uma investigação adequada, é possível que a mudança MAXDOPo ajude. Para um servidor do seu tamanho, eu ficaria com MAXDOP1, 2, 4 ou 8. Não podemos dizer qual deles será o melhor para sua carga de trabalho. Você precisa monitorar seu rendimento antes e depois de mudar MAXDOPpara tirar uma conclusão.

    • 10
  3. Jared Karney
    2019-03-26T03:24:04+08:002019-03-26T03:24:04+08:00
    1. Seu maxdop 'inicial' deve ser 4; menor número de núcleos por nó numa até 8. Sua fórmula está incorreta.

    2. Alta porcentagem de esperas por um tipo específico não significa nada. Tudo no SQL espera, então algo é sempre o mais alto. A ÚNICA coisa que o cxpacket espera significa é que você tem uma alta porcentagem de paralelismo acontecendo. A CPU não parece alta no geral (pelo menos para o instantâneo fornecido), então provavelmente não é um problema.

    3. Antes de tentar resolver um problema, defina o problema. Que problema você está tentando resolver? Nesse caso, parece que você definiu o problema como uma alta porcentagem de esperas de cxpacket, mas isso por si só não é um problema.

    • 0
  4. TheDwindlingDba
    2019-03-31T12:42:00+08:002019-03-31T12:42:00+08:00

    Acho que a pergunta mais pertinente é... você está realmente enfrentando algum problema de desempenho? Se a resposta for não, então por que você está procurando um problema quando não há um?

    Como as outras respostas disseram, tudo espera, e todas as esperas do CX indicam que se você tiver consultas paralelas, algo que mencionarei é que talvez você deva verificar qual é o limite de custo para paralelismo definido SE você estiver tendo problemas com as consultas que estão em paralelo, ou seja, pequenas consultas que não estão realizando muito trabalho em paralelo e isso possivelmente está fazendo com que funcionem pior, não melhor, e grandes consultas que deveriam estar em paralelo estão sendo atrasadas por causa de todas as menores que estão sendo executadas mal.

    Se não, então, você não tem problema, pare de tentar criar um.

    • -2

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve