Latencia IRP_MJ_WRITE de hasta 15 segundos

Latencia IRP_MJ_WRITE de hasta 15 segundos

Hemos escrito una aplicación que realiza escrituras pequeñas (22 kB) en varios archivos a la vez (un subproceso realiza escrituras en cola asíncronas en varias ubicaciones en nombre de otros subprocesos) en el mismo volumen local (RAID1).
El 99,9% de las escrituras son de baja latencia, pero ocasionalmente (tal vez cada minuto o dos) obtenemos una o dos escrituras de latencia enorme (he visto 10 segundos o más) sin ninguna explicación real.

Plataforma: Servidor Win2003 con NTFS.
Monitoreo: Sysinternals Process Monitor (ver enlace a continuación) y nuestro propio registro de aplicaciones.

Hemos intentado varias cosas para intentar resolver este problema que se han obtenido de algunos sitios web, por ejemplo:

  • Hacer que la primera parte de los nombres de archivos sea única para ayudar a la generación de nombres 8.3

  • Escribir archivos en varios directorios

  • Cambiar el almacenamiento en caché de escritura en disco Intel

  • Compartir archivos/impresoras de Windows

    • Minimizar la memoria utilizada

    • Balance

    • Maximice el rendimiento de datos para compartir archivos

    • Maximice el rendimiento de datos para aplicaciones de red

  • Sistema->Avanzado->Rendimiento->Avanzado

  • NtfsDisableLastAccessUpdate: utilice el conjunto de comportamiento fsutil enablelastaccess 1

  • deshabilite la generación de nombres 8.3: use "fsutil conjunto de comportamiento deshabilitar8dot3 1" + reiniciar

  • Habilite un caché del sistema de archivos de gran tamaño

  • Deshabilitar la paginación del código del kernel

  • Límite de bloqueo de página IO

  • Desactivar (o activar) el servicio de indexación

Pero nada parece hacer mucha diferencia. Hay una gran cantidad de cosas que aún no hemos probado, pero nos preguntamos si alguien se había encontrado con el mismo problema, una razón y una solución (programática o no).

Podemos reproducir el problema usando IOMeter y una configuración simple:

  1. Inicie IOMeter y elimine todos los subprocesos de trabajo excepto el primero en 'Topología' usando el botón de desconexión.

  2. Seleccione el subproceso de trabajo y coloque una cruz en el cuadro junto al disco que desea usar en la pestaña Destinos de disco y coloque '2000000' en Tamaño máximo de disco (NOTA: debe tener al menos 1 GB de espacio libre; el tamaño del sector es 512 bytes)

  3. A continuación, cree una nueva especificación de acceso y agréguela al hilo de trabajo:

    • Tamaño de la solicitud de transferencia = 22 kB

    • 100% Secuencial

    • Porcentaje de especificación de acceso = 100%

    • Porcentaje de lectura/escritura = 100% escritura

  4. Cambie la frecuencia de actualización de la pantalla de resultados a 5 segundos, el tiempo de ejecución de la configuración de la prueba a 20 segundos y ambas configuraciones de 'Número de trabajadores para generar automáticamente' a cero.

  5. Seleccione el subproceso de trabajo en el panel Topología y presione el botón Duplicar trabajador 59 veces para crear 60 subprocesos con configuraciones idénticas.

Presione el botón 'Ir' (bandera verde) y controle la pestaña Resultados. El 'Tiempo máximo de respuesta de E/S (ms)' siempre llega al menos a 3500 en nuestra máquina. Nuestra máquina no es exactamente lenta (servidor en rack Xeon de 8 núcleos con 4 GB y RAID integrado).

Me interesaría ver qué obtienen otras personas. Tenemos la sensación de que podría tener algo que ver con el sistema de archivos NTFS (el nuestro está actualmente lleno en un 75% de archivos fragmentados) y vamos a probar algunas cosas en torno a este principio. Pero también está relacionado con el rendimiento del disco, ya que no lo vemos en un disco RAM y no es tan grave en una matriz RAID10.

Cualquier ayuda es muy apreciada.
Ricardo

Haga clic derecho y seleccione 'Abrir enlace en una pestaña nueva':
Resultado del proceso

Respuesta1

Ahora tengo más información sobre este tema.

Habiendo probado la prueba IOMeter descrita en 12 máquinas diferentes usando una variedad de hardware, la he reducido a un chipset RAID específico (3 máquinas diferentes con el mismo chipset exhiben este comportamiento usando RAID1 y RAID10). Todas las demás máquinas obtienen resultados al menos un orden de magnitud mejores.

Conjunto de chips: Intel 631xESB/632xESB SATA RAID (también conocido como ESB2)

Consulte esta publicación en el sitio de Intel para obtener más información y, con suerte, una respuesta de Intel:
Intel 631xESB/632xESB SATA RAID (también conocido como ESB2) escribe lento

Ricardo

información relacionada