Planificar la infraestructura de
hardware para una solución OLAP o OLTP basada en Microsoft SQL Server requiere
comprender cómo funcionan los distintos componentes de SQL Server y cómo sus
cargas de trabajo típicas utilizan recursos de hardware.
La arquitectura del sistema de núcleo
equilibrado se basa en el hecho de que la mayoría de las cargas de trabajo OLAP
o OLTP necesitan transferir cantidades pequeñas a grandes cantidades de datos
(normalmente accedidas por operaciones de lectura secuencial o aleatoria) a
través de múltiples componentes del sistema, desde donde se almacenan los datos
hasta el solicitante Aplicaciones. Cada componente a través del cual se
transfieren los datos es un cuello de botella potencial que limitará el
rendimiento general del sistema. Los datos sólo pueden fluir a la aplicación
solicitante a la velocidad del componente más lento. Todos los componentes que
pueden operar a una velocidad mayor son subutilizados, lo que desestabiliza el
sistema y puede representar un coste desperdiciado significativo.
Maximum Consumption Rate (MCR)
La mayoría de los administradores de
bases de datos quieren comenzar a estimar los requisitos de hardware para una
base de datos determinando el volumen de datos que se van a almacenar y
eligiendo la solución de almacenamiento más grande y más rápida posible. El
enfoque de núcleo equilibrado comienza con el rendimiento del núcleo de la CPU,
y luego construye un sistema equilibrado que se basa en esa métrica. Es
importante darse cuenta de que la tasa máxima de consumo (MCR) es puramente una
medida del rendimiento de datos de SQL Server para un único núcleo y no incluye
operaciones de lectura de disco ni E / S de red. El objetivo es determinar el
MCR del núcleo y utilizarlo para calcular el número de núcleos que se requieren
para soportar la tasa de rendimiento de datos de destino. A continuación, puede
diseñar el subsistema de almacenamiento y red con un conjunto equilibrado de
componentes que alimentarán los datos a los núcleos de la CPU a una velocidad
suficiente para mantener el MCR.
En resumen:
- MCR no es definitivo de los
resultados reales para una carga de trabajo del cliente.
- MCR proporciona una línea de
base de velocidad de procesamiento de datos máxima para SQL Server.
- MCR es específico para una
CPU y un servidor. En general, las tasas para una CPU determinada no
varían mucho según la arquitectura del servidor y la placa base, pero la
MCR final debe determinarse mediante pruebas reales.
MCR es específico para una
combinación de una CPU y una placa base, y SQL Server. No es una medida de
velocidad de procesamiento pura o una indicación del rendimiento que puede
esperar para todas las consultas de solución. En su lugar, MCR es una medida de
referencia específica del sistema de rendimiento máximo por núcleo para cargas
de trabajo de consulta OLAP o OLTP. El cálculo de MCR requiere la ejecución de
una consulta que puede satisfacerse desde la memoria caché mientras limita la
ejecución a un solo núcleo y revisa las estadísticas de ejecución para determinar
el número de megabytes de datos procesados por segundo.
Esta métrica mide la máxima velocidad
de procesamiento de datos de SQL Server para una consulta estándar y un
conjunto de datos para una combinación de servidor y CPU específica. Esto se
proporciona como una tasa por núcleo, y se mide como una exploración basada en
la consulta de la memoria caché. MCR es el punto de partida inicial para el
diseño del sistema. Representa un ancho de banda de E / S máximo estimado para
el servidor, la CPU y la carga de trabajo. MCR es útil como una guía de diseño
inicial porque requiere sólo un almacenamiento local mínimo y un esquema de
base de datos para estimar el rendimiento potencial de una CPU determinada. Es
importante reforzar que el MCR se utiliza como punto de partida para el diseño
del sistema - no es una medida del rendimiento del sistema.
Calcular el MCR
Una tasa de consumo de CPU de línea de
base para la aplicación de SQL Server se establece mediante la ejecución de una
consulta SQL estándar. Esta consulta está diseñada para ser una representación
relativamente simple de una consulta típica para el tipo de carga de trabajo
(en este caso OLTP) y se ejecuta desde caché de búfer. El valor resultante es
específico de la CPU y del servidor en el que se ejecuta la consulta.
Notas:
1. La consulta debe
mantener un tiempo mínimo de ejecución de un segundo.
2. Asegúrese de que la
configuración del Administrador de recursos tenga valores predeterminados.
3. Asegúrese de que la
consulta se está ejecutando desde la caché del búfer.
4. Establezca
STATISTICS IO y STATISTICS TIME en ON para obtener resultados.
5. Ejecute la consulta
varias veces, en MAXDOP = # núcleo por procesador Socket.
(Por ejemplo:
4).
La siguiente consulta se utiliza para
calcular MCR: -
SET STATISTICS IO ON;SET STATISTICS TIME ON;SELECT pivot.[SalesPersonID], pivot.[FullName], pivot.[JobTitle], pivot.[SalesTerritory], pivot.[2011], pivot.[2012], pivot.[2013], pivot.[2014] FROM (SELECT soh.[SalesPersonID], p.[FirstName] + ' ' + COALESCE (p.[MiddleName], '') + ' ' + p.[LastName] AS [FullName], e.[JobTitle], st.[Name] AS [SalesTerritory], soh.[SubTotal], YEAR(DATEADD(m, 6, soh.[OrderDate])) AS [FiscalYear] FROM [SalesPerson] sp INNER JOIN [SalesOrderHeader] soh ON sp.[BusinessEntityID] = soh.[SalesPersonID] INNER JOIN [SalesTerritory] st ON sp.[TerritoryID] = st.[TerritoryID] INNER JOIN [Employee] e ON soh.[SalesPersonID] = e.[BusinessEntityID] INNER JOIN [Person] p ON p.[BusinessEntityID] = sp.[BusinessEntityID]) AS soh PIVOT (SUM([SubTotal]) FOR [FiscalYear] IN ([2011], [2012], [2013],[2014])) AS pivot OPTION (MaxDop 4)
GO 5
A
continuación se muestra el resultado de las estadísticas de E / S y tiempo de
la consulta anterior.
Beginning execution loop
SQL Server parse and compile time:
CPU time =
312 ms, elapsed time = 313 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
(14 row(s) affected)
Table 'Employee'. Scan count 0, logical reads 28,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesTerritory'. Scan count 0, logical reads
28, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'SalesPerson'. Scan count 0, logical reads
34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 0, logical reads 51,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical
reads 43769, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0.
SQL Server
Execution Times:
CPU time =
2328 ms, elapsed time = 2347 ms.
SQL Server parse and compile time:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
(14 row(s) affected)
Table 'Employee'. Scan count 0, logical reads 28,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesTerritory'. Scan count 0, logical reads
28, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'SalesPerson'. Scan count 0, logical reads
34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 0, logical reads 51,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical
reads 43769, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0.
SQL Server
Execution Times:
CPU time =
2203 ms, elapsed time = 2212 ms.
SQL Server parse and compile time:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
(14 row(s) affected)
Table 'Employee'. Scan count 0, logical reads 28,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesTerritory'. Scan count 0, logical reads
28, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'SalesPerson'. Scan count 0, logical reads
34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 0, logical reads 51,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0,
lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical
reads 43769, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0.
SQL Server
Execution Times:
CPU time =
2235 ms, elapsed time = 2304 ms.
SQL Server parse and compile time:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
(14 row(s) affected)
Table 'Employee'. Scan count 0, logical reads 28,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesTerritory'. Scan count 0, logical reads
28, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'SalesPerson'. Scan count 0, logical reads
34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 0, logical reads 51,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical
reads 43769, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0.
SQL Server
Execution Times:
CPU time =
2234 ms, elapsed time = 2271 ms.
SQL Server parse and compile time:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
SQL Server
Execution Times:
CPU time =
0 ms, elapsed time = 0 ms.
(14 row(s) affected)
Table 'Employee'. Scan count 0, logical reads 28,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesTerritory'. Scan count 0, logical reads
28, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'SalesPerson'. Scan count 0, logical reads
34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical
reads 0, lob read-ahead reads 0.
Table 'Person'. Scan count 0, logical reads 51,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 0, logical reads 0,
physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads
0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical
reads 43769, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0.
SQL Server
Execution Times:
CPU time =
2266 ms, elapsed time = 2293 ms.
Batch execution
completed 5 times.
Permite calcular MCR mediante la
siguiente fórmula:
(Promedio de lecturas lógicas /
Promedio de tiempo de CPU) (Sec)) * 8/1024
(28 + 28 + 34 + 51 + 0 + 0 + 43769) *
5) / 5) = 43910 Promedio de
Lecturas Lógicas
(2328 + 2203 + 2235 + 2234 + 2266) /
5 = 2253.2 Tiempo Promedio de la CPU (milisegundos)
(43910 / 2,253) * 8/1024 = 152,26 MB
/ S por núcleo
Enfatice que MCR es específico al
sistema en el cual fue calculado. Sin embargo, las arquitecturas similares de
procesadores y placas base probablemente exhibirán MCRs comparables. Si los
estudiantes tienen la intención de usar sistemas de Fast Track Data Warehouse
de socios de hardware, el MCR para estos sistemas se publica.
Determinación de los requisitos de
los núcleos del procesador
Después de encontrar el valor de MCR
para cada núcleo de CPU, puede comenzar a estimar el número de núcleos
necesarios para soportar cargas de trabajo de consulta. Recuerde que MCR indica
la cantidad de datos que puede procesar un núcleo de procesador en un segundo.
Para determinar el número de núcleos
de procesador necesarios, es necesario conocer los siguientes factores: -
• La cantidad de
datos es devuelta por la carga de trabajo promedio de la consulta.
• Número de usuarios
simultáneos.
• Tiempo de respuesta
de destino para la carga de trabajo de la consulta.
Debe aplicarse la siguiente fórmula:
-
((Tamaño Promedio de resultados de la
consulta (MB) / MCR) * Usuarios concurrentes) / Target Time (Sec)
El MCR del procesador que vamos a
utilizar es 152.26 MB / s, y el resultado medio esperado de la consulta es 343
MB. Debido a la característica OLTP, el número de usuarios simultáneos es de
200 usuarios y nuestro tiempo objetivo es de 5 segundos. El siguiente cálculo
determina el número de núcleos de procesador que se requieren para dicho
entorno.
((343 / 152,26) * 200) / 5 = 90
núcleos del procesador
Arquitectura de la CPU no incluye
exactamente 90 núcleos, por lo que redondear hasta un requisito de 96.
Recuerde que necesita equilibrar el
número de CPUs para que coincida con el número de matrices de almacenamiento
que se utilizarán, lo que a su vez puede depender del volumen de datos que su
almacén de datos debe soportar.
Determinación de los requisitos de
memoria (RAM)
Cálculo de la
cantidad de RAM que se requiere es difícil porque muchas cargas de trabajo
pueden utilizar la memoria para aumentar el rendimiento general. En general,
debe considerar una cifra mínima para un OLTP pequeño o mediano OLAP o sistema
de ser de 4 GB por núcleo, o de 64 a 128 GB por socket de la CPU. Si tiene la
intención de utilizar índices columnstore o soportar modelos de datos tabulares
en el servidor de almacén de datos, debe favorecer el extremo superior de estas
estimaciones. Otra forma de estimar los requisitos de memoria es considerar
que, en una carga de trabajo promedio de almacén de datos, los usuarios
necesitan regularmente acceder a aproximadamente el 20 por ciento de los datos
almacenados.
Determinación de
los requisitos de almacenamiento de la base de datos
Antes de poder determinar
completamente los requisitos de CPU, memoria y hardware de almacenamiento, debe
evaluar el volumen de datos que debe soportar el sistema. La mayoría de las
bases de datos consisten principalmente en datos. Determinar el volumen de
datos que la base de datos debe almacenar es el factor más importante en la
evaluación de los requisitos generales de almacenamiento.
Para comenzar a estimar los volúmenes
de datos, determine el número de filas que se cargarán inicialmente en la base
de datos y multiplíquela por el tamaño promedio de una fila. Si no conoce el
tamaño promedio de la fila en esta etapa, utilice una estimación conservadora
tal como 100 bytes por fila. Por ejemplo, una base de datos que contendrá 200.000.000
filas, cada 100 bytes de longitud, tendrá un volumen de datos de hechos inicial
de aproximadamente 20 GB.
Después de estimar los datos
iniciales, añada aproximadamente 30 a 40 por ciento para permitir los índices.
Por lo tanto, para continuar el ejemplo con 20 GB de datos, se sumarían
aproximadamente 8 GB (40 por ciento de 20 GB), dando un volumen de datos
inicial de aproximadamente 28 GB.
Para asegurarse de que su solución de
almacenamiento soportará la base de datos en el futuro (digamos, en tres años a
partir de ahora), debe tener en cuenta los datos incrementales anticipados que
se cargarán. Por ejemplo, supongamos que los datos de hecho en nuestra base de
datos representan los artículos individuales que se han ordenado en las
transacciones de ventas y la empresa suele vender 5.000.000 de artículos al
mes, puede esperar cargar 5.000.000 de filas (cada una con 100 bytes de datos)
o aproximadamente 500 MB cada mes. Eso equivale a una tasa de crecimiento de
datos de 6 GB por año, por lo que en tres años, la base de datos de ejemplo
necesitaría soportar los 28 GB de datos iniciales más otros 18 GB (6 GB al año
multiplicados por tres años), dando un total de 46 GB.
Puede planear para comprimir los
datos en su base de datos. Normalmente, SQL Server proporciona un factor de
compresión de aproximadamente 3: 1, por lo que los 46 GB de datos deben
comprimir a aproximadamente 15,5 GB en disco
Además de la base de datos, debe
incluir otros datos en su estimación de almacenamiento. Se requiere
almacenamiento adicional para:
• Bases de datos de
configuración: si las bases de datos que son utilizadas por otros servicios de
BI, incluidas las bases de datos de SSIS Catalog y Reporting Services, se deben
instalar en el servidor de bases de datos, debe incluirlas en su estimación de
almacenamiento. Además, la instancia de SQL Server incluye bases de datos del
sistema, aunque en la práctica, éstas suelen almacenarse por separado de los
archivos de datos de la base de datos.
• Archivos de
registro de transacciones: Cada base de datos requiere un registro de
transacciones. Normalmente, las bases de datos se configuran para utilizar el
modelo de recuperación simple (para Data Warehouse) y el modelo de recuperación
completa (para OLTP).
• TempDB: muchas
consultas de base de datos requieren espacio de almacenamiento temporal.
Generalmente se recomienda localizar tempdb en una columna de almacenamiento
adecuada y asignar un tamaño inicial adecuado para evitar que el sistema lo
haga crecer automáticamente según sea necesario. •
• Tablas de espera:
si los datos se almacenan en una base de datos de almacenamiento temporal
dedicada, en tablas dentro de la propia base de datos o en una combinación de
ambos, debe asignar espacio suficiente para permitir la estadificación de datos
durante los procesos de ETL.
• Copias de
seguridad: si tiene la intención de realizar una copia de seguridad de la base
de datos y otras bases de datos en disco, debe asegurarse de que el diseño de
almacenamiento proporcione espacio para los archivos de copia de seguridad. •
• Modelos de Analysis
Services: si tiene la intención de alojar modelos de datos de Analysis Services
multidimensionales en el servidor de almacén de datos, debe asignar suficiente
espacio en disco para ellos.
Consideraciones sobre el sistema de
almacenamiento
La solución de hardware de almacenamiento óptima
para un almacén de datos depende de varios factores, incluido el volumen de
datos y el sistema MCR que debe soportar el rendimiento de datos del sistema de
almacenamiento. Al planear una solución de almacenamiento, considere las
siguientes pautas:
•
Tamaño del disco: Utilice más, discos
más pequeños en lugar de menos, discos más grandes. Aunque es posible crear una
base de datos que almacena todos sus datos en un único disco duro grande,
normalmente es posible lograr un mejor equilibrio de rendimiento (y, por lo
tanto, rendimiento general del sistema) distribuyendo los datos a través de
múltiples discos pequeños. Esto permite realizar varias lecturas de disco en
paralelo y reduce los tiempos de espera para las operaciones de E / S.
•
Velocidad del disco: utilice los
discos más rápidos que pueda permitirse. Las tecnologías de disco han avanzado
dramáticamente en los últimos años, con la velocidad de los discos mecánicos
aumentando y la llegada de discos de estado sólido sin partes móviles. Sin
embargo, un disco más rápido significa un mayor rendimiento al leer datos. Los
discos de estado sólido suelen ser más caros que los discos mecánicos, pero si
el rendimiento del disco es crítico, puede decidir que el costo adicional vale
la pena pagar. La falta de partes móviles hace que sean particularmente
eficaces para el acceso aleatorio de datos de E / S, que es típico de las
consultas contra la base de datos.
•
RAID: Utilice RAID 10 o RAID mínimo
5. RAID 10 (en el que los datos están reflejados y rayados) proporciona el
mejor equilibrio entre el rendimiento de lectura y la protección frente a
fallos de disco, lo que suele ser la primera opción para las bases de datos.
Sin embargo, el requisito de un conjunto completo de discos redundantes por
arreglo puede hacer que esta opción sea costosa. Como alternativa, puede
utilizar RAID 5, que proporciona rayas para un alto rendimiento de lectura y
redundancia de datos basada en paridad para proteger contra fallas de disco.
Fuente: 20767- Course Implementación de SQL Data Warehouse