En esta sesión daremos una vuelta completa al paralelismo en SQL Server, hablaremos de parámetros de configuración, planes de ejecución paralelos, operadores paralelos y mucho más. Además veremos cómo monitorizar y detectar problemas de paralelismo y las posibles soluciones
1. SOLIDQ SUMMIT MADRID 2017
#SQSummit17
Enrique Catalá | Mentor | ecatala@solidq.com | @enriquecatala
Sácale rendimiento a tu hardware con el
paralelismo de SQL Server
5. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Symmetric
Multiprocessing System
(SMP)
Todas las CPU comparten
la misma memoria
Sin particionado HW para
acceso a memoria
Típico en computadoras
de consumo
Memory
CPU CPU CPU CPU
System bus
CPU CPU CPU CPU
SMP architecture
CPU
CPU
CPU
CPU
F
S
B
Main
Memory
6. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Non-Uniform
Memory Access
Nodos
conectados por
bus compartido
Típico en
servidores de
gama media-alta
Shared Bus
Memory
Controller
CPU CPU CPU CPU
Memory
Controller
CPU CPU CPU CPU
Memory
Controller
CPU CPU CPU CPU
Memory
Controller
CPU CPU CPU CPU
Node Controller Node Controller Node Controller Node Controller
7. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Massively Parallel
Processing
Nodos de
computación con
SQL conectados
Arquitecturas DW
petabyte (PDW,
Azure SQLDW)
8. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
• Automáticamente detecta configuraciones NUMA y se adapta
Compatible
• Minimiza latencia de memoria tratando de usar la memoria local de
cada nodo
Data-locality
• Se puede afinar manualmente
Configurable
9. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
SQLOS
Memory Node
CPU Node
Scheduler
Worker
Task
SQLOS
• Crea un scheduler para cada CPU
lógica
• Es como un gestor de recursos…OS
Scheduler
• Como una CPU lógica usada por los
workers
Worker
• Son como “threads” lógicos
Task
• Unidad de trabajo para un worker
(sentencia simple)
10. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Competitiva
• Usa arquitectura de
prioridades de procesos
• Cada thread ejecuta en un
slot de tiempo
predeterminado
• Un thread puede ser
rechazado de ejecución por
otro de mayor prioridad
Cooperativa
• Basada en listas de espera
• Cada tarea se pone a si
misma en lista de espera
cuando necesita recurso
• El mismo scheduler ejecuta
hasta el final
• Se previene context
switching
11. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Multi-Instancias
Tener varias instancias en el
mismo HW
Licenciamiento
Afinar qué cores queremos
asignar de los licenciados
12. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Auto afinado al inicio de instancia
Hasta 30% beneficio
CPU > 8 cores HT
Se previenen mezclas logical-only o physical only nodes
14. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
if(best_plan_for_now.cost<1) return(best_plan_for_now)
else if(MAXDOP>0
and )
return( )
Configuración
• A nivel de
instancia
• Sp_configure
Finalidad
• Cambiar
estadísticamente
el nº de planes de
ejecución
Recomendación
• En entorno OLTP
mínimo subir a 50
15. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
if(best_plan_for_now.cost<1) return(best_plan_for_now)
else if(
and best_plan.cost > threshold for parallelism)
return(MIN(create_paralel_plan().cost, best_plan_for_now))
Configuración
• A todos los niveles
• Instancia, BBDD,
conexión y query
Finalidad
• Limita
explicitamente el
nº de CPUs que un
worker puede usar
para una tarea
Recomendación
• En entorno OLTP
recomendado 1
• Afinar
agregaciones y op.
mantenimiento a 0
19. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Hash
• Los valores de
filas obtienen
hash y cada hilo
se responsabiliza
de un rango
hash
Round-robin
• Los valores de
las filas se
envían al
siguiente hilo de
la lista
Broadcast
• Todas las filas se
envian a todos
los hilos
Range
• Determina a que
hilo enviar la fila
evaluando una
funcion de
rango sobre una
columna
• Rara y usada en
algunos parallel
index recreation
Demand
• Se usa un modo
pull en lugar de
push como en
las otras.
• Envia la fila al
thread que se la
está pidiendo
• Aparece en
tablas
particionadas
20. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Consume múltiples fuentes
y produce multiples fuentes
No se modifican las filas
Se reducen filas si aparece
un operador bitmap
21. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Consume múltiples hilos
y produce un único hilo
Combina resultados
Es el que genera el
famoso CXPACKET wait
22. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Type
# producer
threads
# consumer
threads
Gather
Streams
DOP 1
Repartition
Streams
DOP DOP
Distribute
Streams
1 DOP
25. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
Mala configuración DOP
Mala configuración de affinidad de procesador
Estadísticas desactualizadas
• Generalmente problemas HW o mala configuración HW
Cambios de context excesivos
Malas arquitecturas de aplicación que estresan la CPU
26. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
• MAXDOP = 0
• Threshold for parallelism = 5
Nunca usar la configuración por defecto
• MAXDOP = 1
• Threshold for parallelism = 50
OLTP puro
• MAXDOP = #’Phisical cores’
DW
• MAXDOP <= #physical_cores_numa_node
Regla de oro
wait type name wait time (ms) requests
CXPACKET 786556034 128110444
LATCH_EX 255701441 155553913
ASYNC_NETWORK_IO 129888217 19083082
PAGEIOLATCH_SH 83672746 2813207
WRITELOG 70634742 48398646
SOS_SCHEDULER_YIELD 47697175 176871743
27. SOLIDQ SUMMIT MADRID 2017SOLIDQ SUMMIT MADRID 2017
• ALTER INDEX, Statistics operations …
• Agregaciones (AVG, MAX,…)
• Recuerda que existe Resource Governor
¿Cuándo aplicar MAXDOP?
• Recomendación = #physical_cores
• Sistemas OLTP deberian configurarse a 1
• Siempre que veamos alto % de esperas CXPACKET
¿Cuándo aplicar “max degree of parallelism”?
• Cuando quieras cambiar el nº de operaciones paralelas estadísticamente
¿Cuándo aplicar “cost threshold for parallelism?