Tenemos los archivos de datos del usuario y del sistema en la misma unidad de disco. El (io_stall_write_ms / (1.0 + num_of_writes)) está por debajo de 2 para los archivos de usuario, pero los archivos tempdb suelen tener más de 400. Veo eso en algunos servidores y tengo curiosidad si hay una razón por la que toma más tiempo escribir en tempdb que un archivo de datos de base de datos normal.
SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result,
io_stall_write_ms, num_of_writes,
fs.database_id,
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
Gracias,
Respuestas:
Respuesta corta: Ver puestos de IO más altos puede o no ser un problema en sí mismo. Debe buscar más información para saber si tiene un problema. Parece un poco alto, sí, pero ¿estás sufriendo? Si es así, probablemente se deba a que su sistema IO no está manejando la carga correctamente (porque no puede hacerlo, porque tiene todo en una unidad u otra razón) o está haciendo demasiado en TempDB (cambiando el primer problema: el rendimiento de IO: es probablemente una solución más fácil y más eficiente, pero primero determine si tiene un problema)
La discusión / respuesta más larga:
Aquí hay dos preguntas en juego:
1.) ¿Qué hago cuando veo puestos de IO altos?
En primer lugar, "alto" está en el ojo del espectador. Si le preguntara a 10 DBA qué es "demasiado alto" para los puestos de E / S, probablemente obtendría 2-3 respuestas diferentes con números, 5-6 respuestas "Depende" y una mirada en blanco. Mi suposición es que un promedio de 400 ms es potencialmente demasiado alto aquí, especialmente cuando los otros DB son 2 ms o menos para el tiempo de pérdida promedio.
Independientemente de qué base de datos esté viendo los puestos altos, debe abordarlo de la misma manera. Un puesto de E / S es lo que parece ... Una solicitud de E / S tarda más de lo esperado ... Se estanca. Estas suceden. Suceden todo el tiempo en un sistema con recursos compartidos y recursos finitos (realmente todos nuestros sistemas). Se convierten en un problema cuando los puestos se convierten en problemas de rendimiento o conducen a ellos. Así que confío en que está buscando aquí como una parte proactiva de la supervisión o porque estaba experimentando problemas de rendimiento que está solucionando. Tampoco queremos perdernos solo en puestos de E / S. Estamos viendo una pieza del rompecabezas y no el panorama general. Puede ser problemático solo mirar las estadísticas de espera o las estadísticas del archivo desde que SQL se reinició por última vez porque está mirando todo el tiempo y alguna ventana de mantenimiento o ventana de carga pesada podría sesgar los contadores. Así que asegúrese de mirar la imagen completa.
Pero cuando sospecho que tengo un problema de rendimiento del disco o veo algo en una consulta como esta, normalmente sigo un proceso que se parece a:
PAGEIOLATCH_*
,IO_COMPLETION
,WRITELOG
, etc.?). Si hace esto, es otra indicación de que tiene algunos problemas de rendimiento relacionados con IO, al igual que los bloqueos de IO. Pero te da otra forma de acuerdo aquí.Physical Disk:Avg Disk Sec/Read
yAvg Sec Disk Sec/Write
. Estos miden tu latencia. Observe estos contadores durante un período de tiempo guardado en un archivo de registro de rendimiento. ¿Qué viste para los promedios? Si ve números de más de 0.020 segundos (20 ms), esto podría ser un problema. Si ve números de más de 40-50 ms de promedio o más, es una indicación más firme de un problema. También mira tus picos? ¿Qué tan alto van y cuánto duran? Si ve picos en los cientos de ms y duran decenas o decenas de segundos o más y / o ocurren con frecuencia, es más probable que tenga un problema con su rendimiento de IO para su carga de trabajo.( Nota: para este análisis de estadísticas de espera y análisis de rendimiento, observe varios períodos y tipos de uso. ¿Tiene estadísticas de uso diferentes por la noche que durante el día? ¿Ventanas de procesamiento por lotes? ¿Ventanas de mantenimiento donde reconstruye muchos índices? Mire estas herramientas durante cada uno de estos períodos y entienda lo que está viendo para cada uno)
Otra consideración de rendimiento de IO aquí:
2.) ¿Cuáles son algunas razones por las que TempDB podría ser mayor?
Entonces TempDB es una base de datos y puede tener paradas de E / S como cualquier otra base de datos como acabo de comentar. Pero, ¿cuáles son algunas razones por las que TempDB puede tener lecturas más altas? (no exhaustivo, agradezco adiciones o pensamientos en ediciones, otras respuestas o comentarios) -
El punto es: TempDB se usa de muchas maneras, y no me sorprende en absoluto verlo como una de sus bases de datos más ocupadas, si no la más ocupada. Tampoco me sorprende cuando veo que tiene el mayor número de puestos y el promedio más alto de todas las bases de datos en el sitio de un cliente. Es la naturaleza de su carga de trabajo a veces. Mirar algunas de las cosas que he mencionado aquí ciertamente puede ayudarlo a determinar si estos números indican un problema y, de ser así, cómo profundizar en su resolución.
fuente
TempDB se comparte entre todas las bases de datos de la instancia. Por lo tanto, a veces puede haber contención dentro de TempDB para ciertas páginas: SGAM , GAM y PFS . En pocas palabras, estas páginas realizan un seguimiento de lo que se ha utilizado en TempDB hasta ahora y dónde hay espacio disponible para un nuevo uso.
Por lo general, esto se soluciona agregando múltiples archivos de datos a TempDB. Hay algunas filosofías diferentes en cuanto al número correcto, pero todos están de acuerdo en que debe tener más de uno.
Aquí hay algunas consultas para ejecutar ...
Este le mostrará cuántos archivos tiene TempDB y dónde están ubicados.
Este le mostrará cuántas CPU y núcleos tiene.
Este le mostrará cuántos nodos y núcleos NUMA por nodo NUMA tiene.
Este le mostrará qué páginas están experimentando esperas en TempDB.
Aquí hay un artículo que profundiza un poco más en el tema de contención de la página.
OK, ahora la parte de filosofía ... :-)
Para mí, si estoy en un sistema SMP , solo quiero tantos archivos como la mitad de los núcleos totales .
Si estoy en un sistema NUMA , entonces solo quiero tantos archivos como núcleos por nodo NUMA .
Sin embargo, rara vez veo alguna mejora por tener más de cuatro archivos para TempDB. Por lo general, comienzo con cuatro y superviso la contención como se explica en el artículo al que me vinculé.
Si sigo viendo problemas, entonces agregaría dos más. Verifique nuevamente, agregue más y repita hasta que desaparezca la contención.
fuente