Los registros y las unidades de datos tienen diferentes patrones de acceso a datos que están en conflicto entre sí (al menos en teoría) cuando comparten una unidad.
El registro escribe
El acceso al registro consta de una gran cantidad de pequeñas escrituras secuenciales. De manera algo simplista, los registros de DB son buffers de anillo que contienen una lista de instrucciones para escribir elementos de datos en ubicaciones particulares del disco. El patrón de acceso consiste en una gran cantidad de pequeñas escrituras secuenciales que se debe garantizar que se completen, por lo que se escriben en el disco.
Idealmente, los registros deben estar en un volumen silencioso (es decir, no compartido con nada más) RAID-1 o RAID-10. Lógicamente, puede ver el proceso como el DBMS principal que escribe entradas de registro y uno o más hilos lectores de registro que consumen los registros y escriben los cambios en los discos de datos (en la práctica, el proceso está optimizado para que las escrituras de datos se escriban fuera inmediatamente donde sea posible). Si hay otro tráfico en los discos de registro, estos otros accesos mueven los cabezales y las escrituras secuenciales se convierten en escrituras aleatorias. Estos son mucho más lentos, por lo que los discos de registro ocupados pueden crear un punto de acceso que actúa como un cuello de botella en todo el sistema.
Escrituras de datos
(actualizado) Las escrituras de registros deben confirmarse en el disco (denominadas medios estables) para que una transacción sea válida y elegible para confirmar. Uno puede ver esto lógicamente como entradas de registro que se escriben y luego se usan como instrucciones para escribir páginas de datos en el disco mediante un proceso asincrónico. En la práctica, las escrituras de la página del disco están realmente preparadas y almacenadas en el búfer en el momento en que se realiza la entrada del registro, pero no necesitan escribirse inmediatamente para que se confirme la transacción. Las memorias intermedias de disco se escriben en medios estables (disco) mediante el proceso Lazy Writer (Gracias a Paul Randal por señalar esto) que este artículo de Technet analiza con un poco más de detalle.
Este es un patrón de acceso muy aleatorio, por lo que compartir los mismos discos físicos con los registros puede crear un cuello de botella artificial en el rendimiento del sistema. Las entradas de registro deben escribirse para que la transacción se confirme, por lo que tener búsquedas aleatorias ralentiza este proceso (la E / S aleatoria es mucho más lenta que la E / S de registro secuencial) convertirá el registro de un dispositivo de acceso secuencial en un dispositivo de acceso aleatorio. Esto crea un serio cuello de botella de rendimiento en un sistema ocupado y debe evitarse. Lo mismo se aplica al compartir áreas temporales con volúmenes de registro.
El papel del almacenamiento en caché
Los controladores SAN tienden a tener grandes cachés de RAM, que pueden absorber el tráfico de acceso aleatorio hasta cierto punto. Sin embargo, para la integridad transaccional, es deseable tener escrituras en disco desde un DBMS garantizadas para completarse. Cuando un controlador está configurado para usar el almacenamiento en caché de reescritura, los bloques sucios se almacenan en caché y la llamada de E / S se informa como completa al host.
Esto puede suavizar muchos problemas de contención ya que el caché puede absorber una gran cantidad de E / S que de otro modo se irían al disco físico. También puede optimizar las lecturas y escrituras de paridad para RAID-5, lo que disminuye el efecto sobre el rendimiento que tienen los volúmenes RAID-5.
Estas son las características que impulsan la escuela de pensamiento 'Deje que la SAN se ocupe de ello', aunque esta visión tiene algunas limitaciones:
El almacenamiento en caché de reescritura aún tiene modos de falla que pueden perder datos, y el controlador se ha conectado al DBMS, diciendo que los bloques se han escrito en el disco donde en realidad no. Por esta razón, es posible que no desee utilizar el almacenamiento en caché de reescritura para una aplicación transaccional, en particular algo que contenga datos financieros o de misión crítica donde los problemas de integridad de datos podrían tener serias consecuencias para el negocio.
SQL Server (en particular) usa E / S en un modo en el que un indicador (denominado FUA o acceso de actualización forzada) fuerza las escrituras físicas en el disco antes de que vuelva la llamada. Microsoft tiene un programa de certificación y muchos proveedores de SAN producen hardware que cumple con esta semántica (requisitos resumidos aquí ). En este caso, ninguna cantidad de caché optimizará las escrituras en disco, lo que significa que el tráfico de registros se agitará si se encuentra en un volumen compartido ocupado.
Si la aplicación genera mucho tráfico de disco, su conjunto de trabajo puede desbordar el caché, lo que también causará problemas de contención de escritura.
Si la SAN se comparte con otras aplicaciones (particularmente en el mismo volumen de disco), el tráfico de otras aplicaciones puede generar cuellos de botella en el registro.
Algunas aplicaciones (por ejemplo, almacenes de datos) generan grandes picos de carga transitorios que los hacen bastante antisociales en las SAN.
Incluso en una SAN grande, los volúmenes de registro separados siguen siendo una práctica recomendada. Puede salirse con la suya sin preocuparse por el diseño en una aplicación poco utilizada. En aplicaciones realmente grandes, incluso puede obtener un beneficio de múltiples controladores SAN. Oracle publica una serie de estudios de caso de diseño de depósito de datos donde algunas de las configuraciones más grandes involucran múltiples controladores.
Poner la responsabilidad del desempeño donde corresponde
En algo con grandes volúmenes o donde el rendimiento podría ser un problema, haga que el equipo de SAN sea responsable del rendimiento de la aplicación. Si van a ignorar sus recomendaciones de configuración, asegúrese de que la administración esté al tanto de esto y que la responsabilidad del rendimiento del sistema recaiga en el lugar apropiado. En particular, establezca pautas aceptables para las estadísticas clave de rendimiento de la base de datos, como esperas de E / S o esperas de retención de página o SLA de E / S de aplicaciones aceptables.
Tenga en cuenta que tener la responsabilidad del rendimiento dividido en varios equipos crea un incentivo para señalar con el dedo y pasar el dinero al otro equipo. Este es un antipatrón de gestión conocido y una fórmula para problemas que se prolongan durante meses o años sin resolverse nunca. Idealmente, debería haber un único arquitecto con autoridad para especificar los cambios de configuración de la aplicación, la base de datos y la SAN.
Además, compare el sistema bajo carga. Si puede organizarlo, los servidores de segunda mano y las matrices de conexión directa se pueden comprar de forma bastante económica en Ebay. Si configura un cuadro como este con una o dos matrices de discos, puede combinar con la configuración del disco físico y medir el efecto en el rendimiento.
Como ejemplo, he hecho una comparación entre una aplicación que se ejecuta en una SAN grande (un IBM Shark) y una caja de dos sockets con una matriz U320 de conexión directa. En este caso, £ 3,000 en hardware comprado en eBay superó a un SAN de gama alta de £ 1M por un factor de dos: en un host con una configuración de memoria y CPU aproximadamente equivalente.
A partir de este incidente en particular, se podría argumentar que tener algo como esto es una muy buena manera de mantener honestos a los administradores de SAN.