FIX: Verificarsi problemi di prestazioni in ambienti di NUMA durante l'elaborazione in SQL Server 2012 o SQL Server 2014 pagina esterna

BUG #: 201012 (manutenzione del contenuto) VSTS:1952739

Sintomi

Negli ambienti di NUMA, Microsoft SQL Server si verifica uno o più dei seguenti problemi di prestazioni:

  • Un processo di SQL Server esperienze di utilizzo eccessivo della CPU.

  • Esecuzione delle query richiede molto tempo per essere completata.

  • Applicazioni o processi di agente SQL Server verifichino il timeout di query o timeout della connessione.

  • Un processo di SQL Server viene riavviato dal servizio Cluster.

Inoltre, si verifichino i seguenti sintomi:

  • Valori elevati per SOS_PHYS_PAGE_CACHE il tipo di attesa quando si esegue una query della vista a gestione dinamica (DMV) os_wait_stats

  • Valori elevati per il CMEMTHREAD attendere tipo e spinlock SOS_SUSPEND_QUEUE quando si esegue una query sys.dm_os_spinlock_stats DMV

Risoluzione

Informazioni sull'aggiornamento cumulativo

Il problema è stato risolto prima nell'aggiornamento cumulativo seguente di SQL Server.

Aggiornamento cumulativo 2 per SQL Server 2014/en-us/help/2967546

Aggiornamento cumulativo 1 per SQL Server 2014/en-us/help/2931693

Aggiornamento cumulativo 9 per SQL Server 2012 SP1/en-us/help/2931078

Ogni nuovo aggiornamento cumulativo per SQL Server contiene tutti gli hotfix e tutte le correzioni di protezione che sono state incluse nell'aggiornamento cumulativo precedente. Estrarre gli ultimi aggiornamenti cumulativi per SQL Server:


Informazioni sull'hotfix
Un hotfix supportato è disponibile da Microsoft. Tuttavia, questo hotfix è destinato esclusivamente alla correzione del problema descritto in questo articolo. Applicare questo hotfix solo ai sistemi in cui si verificano questo problema specifico.

Se l'hotfix è disponibile per il download, vi è una sezione "Hotfix Download disponibile" nella parte superiore di questo articolo della Knowledge Base. Se non viene visualizzato in questa sezione, inviare una richiesta al servizio clienti Microsoft e supporto tecnico per ottenere l'hotfix.

Nota: Se si verificano ulteriori problemi o se qualsiasi risoluzione dei problemi è necessario, è necessario creare una richiesta di assistenza separata. I costi di supporto normale verranno applicati per eventuali ulteriori domande e problemi che non dovessero rientrare specifico hotfix in questione. Per un elenco completo dei numeri di telefono del servizio clienti Microsoft e supporto tecnico o per creare una richiesta di assistenza separata, visitare il seguente sito Web Microsoft:

http://support.microsoft.com/contactus/?ws=supportNota: Il modulo "Hotfix Download disponibile" Visualizza le lingue per cui è disponibile l'hotfix. Se non viene visualizzata la lingua, è perché un aggiornamento rapido non è disponibile per tale lingua.

Importante Questa correzione è consigliata per qualsiasi istanza di SQL Server installato in un sistema NUMA, indipendentemente dalle impostazioni di maschera di affinità di SQL Server. Questa correzione risolve il collo di bottiglia prestazioni elaborazione nel gestore della memoria di SQL Server.
Il problema è stato risolto prima nell'aggiornamento cumulativo seguente di SQL Server.

Soluzione alternativa

Per risolvere questi problemi, aumentare i valori di timeout di query e di accesso per le applicazioni.

Nota: Questa soluzione può essere limitata il relativo effetto. Si consiglia di applicare l'hotfix per risolvere i problemi descritti nella sezione "Sintomi".

Stato

Microsoft ha confermato che questo è un problema dei prodotti Microsoft elencati nella sezione "Si applica a".

Ulteriori informazioni

Quando il gestore della memoria del Microsoft SQL Server alloca memoria per un nodo di accesso alla memoria non uniforme (NUMA)-ambienti abilitati, Windows possono allocare la memoria di entrambi i locali e remoti nodi (indicati come "non al computer" o "esterne" pagine) finché la destinazione desiderata per ogni nodo è stato raggiunto. Poiché questi non al computer "pagine" non ideale dal punto di vista delle prestazioni, il processo di SQL Server tenta di assegnare i buffer di stoccaggi per il nodo di memoria corretta o rilasciare queste pagine al sistema operativo. Questa elaborazione"non al computer" può essere elevato utilizzo della CPU e comportare una riduzione dei tassi di batch durante un periodo di maggiore utilizzo della CPU.

Quando il nodo locale raggiunge la memoria di destinazione, i thread di lavoro consentono nodi remoti di raggiungere gli obiettivi. Allo stesso tempo, può verificarsi l'allocazione del nodo remoto e il rilascio dei buffer AWAY sullo stesso nodo. Ciò si verifica perché questi percorsi di codice sono protetti dallo stesso oggetto di sincronizzazione. Ciò provoca un conflitto, che provochi un aumento dell'utilizzo della CPU e tempo di attesa lunghi.

Nel progetto corrente durante il rilascio di blocchi di stoccaggio, abbiamo annullare il mapping di pagine e liberare nella cache della pagina fisica. Durante l'allocazione, abbiamo nuovamente allocare le pagine ed eseguire il mapping nuovamente. In questo modo l'accesso alla cache di pagine fisiche e aggiunge il conflitto sul blocco della cache di pagina fisica.

La modifica di questo hotfix aggiunge un parametro ReleaseAwayBlock per indicare che le pagine devono essere connessa solo e non liberato alla cache. Quando il flag è impostato, le pagine sono solo non mappata, e viene restituita la matrice PFN per le pagine non mappate. Durante l'allocazione, ha restituito PFN matrice viene utilizzata per chiamare direttamente MapUserPhysicalPages. Cache della pagina fisica, pertanto non è accessibile.

Informazioni sullo stackntdll!ZwSignalAndWaitForSingleObjectkernel32!SignalObjectAndWait
sqldk!SystemThread::SignalAndWait
sqldk!SOS_Scheduler::Switch
sqldk!SOS_Scheduler::SuspendNonPreemptive
sqldk!SOS_Scheduler::Suspend
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::LongWait
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::Wait
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::Wait
sqldk!TAutoMutex<UnfairRecursiveMutexInternal<SuspendQueueSLock,0>,4294967295>::GetAccess
sqldk!PhysicalPageCache::AllocatePhysicalPages
sqldk!MemoryNode::AllocateUserPhysicalPages
sqldk!SOS_MemoryBlockAllocator::CommitBlockAndCheckNumaLocality
sqldk!SOS_MemoryBlockAllocator::AllocateBlock
sqldk!SOS_MemoryWorkSpace::AllocatePage
sqldk!MemoryNode::AllocatePagesInternal
sqldk!MemoryClerkInternal::GetParentBrokerType
sqldk!MemoryClerkInternal::AllocatePages
sqldk!MemoryObjectFactory::CreateMemObjectInt
sqldk!MemoryObjectFactory::CreateMemObject
sqldk!SOS_UserStore::InitMemoryComponents
sqldk!SOS_UserStore::CreateStore
sqllang!FCreateAccessCheckResultStore
sqllang!CUserToken::InitToken
sqllang!CreateUserToken
sqllang!CUEnvTransient::PSecc
sqllang!FCheckDbAccess
sqllang!CSecurityContext::GetUserToken
sqllang!CSecurityContext::IdUser
sqllang!FHasEntityPermissionsWithAuditState
sqllang!FHasEntityPermissions
sqllang!CSQLObject::FPostCacheLookup
sqllang!CSQLSource::EpgParsingGrammar
sqllang!CAutoRestoreParsingGrammar::{ctor}
sqllang!CSQLSource::Transform
sqllang!CSQLSource::Execute
sqllang!CProtocolHeaderInfo::{dtor}
sqllang!process_request
sqllang!process_commands
sqldk!SOS_Task::Param::Execute
sqldk!SOS_Scheduler::RunTask
sqldk!SOS_Scheduler::ProcessTasks
sqldk!SchedulerManager::WorkerEntryPoint
sqldk!SystemThread::RunWorker
sqldk!SystemThreadDispatcher::ProcessWorker
sqldk!SchedulerManager::ThreadEntryPoint
kernel32!BaseThreadInitThunk
ntdll!RtlUserThreadStart

ntdll!ZwSignalAndWaitForSingleObject
kernel32!SignalObjectAndWait
sqldk!SystemThread::SignalAndWait
sqldk!SOS_Scheduler::Switch
sqldk!SOS_Scheduler::SuspendNonPreemptive
sqldk!SOS_Scheduler::Suspend
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::LongWait
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::Wait
sqldk!UnfairRecursiveMutexInternal<SuspendQueueSLock,0>::Wait
sqldk!TAutoMutex<UnfairRecursiveMutexInternal<SuspendQueueSLock,0>,4294967295>::GetAccess
sqldk!PhysicalPageCache::FreePhysicalPages
sqldk!MemoryNode::FreeUserPhysicalPages
sqldk!SOS_MemoryWorkSpace::DeCommitBlock
sqldk!SOS_MemoryBlockAllocator::DeCommitBlock
sqldk!MemoryNode::ReleaseAwayBlocks
sqldk!SOS_MemoryBlockAllocator::CommitBlockAndCheckNumaLocality
sqldk!SOS_MemoryBlockAllocator::AllocateBlock
sqldk!SOS_MemoryWorkSpace::AllocatePage
sqldk!MemoryNode::AllocatePagesInternal
sqldk!MemoryClerkInternal::GetParentBrokerType
sqldk!MemoryClerkInternal::AllocatePages
sqldk!MemoryObjectFactory::CreateMemObjectInt
sqldk!MemoryObjectFactory::CreateMemObject
sqllang!SOS_OS::CreateMemObject
sqllang!PmoNewMemObjNoX
sqllang!TDSSNIClient::ProcessCommon
sqldk!SOS_Task::Param::Execute
sqldk!SOS_Scheduler::RunTask
sqldk!SOS_Scheduler::ProcessTasks
sqldk!SchedulerManager::WorkerEntryPoint
sqldk!SystemThread::RunWorker
sqldk!SystemThreadDispatcher::ProcessWorker
sqldk!SchedulerManager::ThreadEntryPoint
kernel32!BaseThreadInitThunk
ntdll!RtlUserThreadStart

Riferimenti

Per ulteriori informazioni su come comprendere il concetto di pagine esterne, visitare il seguente sito Web post di blog MSDN:

Come funziona: SQL Server (blocchi di memoria locale, esterna e stoccaggio di NUMA)

Author:jannaw;
Autore: v-shysun
Revisore tecnico: Bob Dorr; Bob Ward; Ajayj; Sureshka; ramakoni; jannaw; sqlprev
Editor: v-jesits

Serve aiuto?

Amplia le tue competenze
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa a Microsoft Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×