2010-01-10 9 views
6

Estoy leyendo un archivo y leo una fila de datos (1600 lecturas secuenciales de 17 bytes) o una columna de datos (1600 lecturas de 17 bytes separadas por 1600 * 17 = 27.200 bytes). El archivo está en una unidad local o en una unidad remota. Hago las lecturas 10 veces, así que espero en cada caso leer en 272,000 bytes de datos.Lectura de archivos a través de la red debido a lecturas extra

En el disco local, veo lo que espero. En el disco remoto cuando leo de forma secuencial, también veo lo que espero, pero al leer una columna, veo que se realizan muchas lecturas adicionales. Tienen 32.768 bytes de longitud y no parecen usarse, pero hacen que la cantidad de datos que se leen salte de 272,000 bytes a cualquier lugar desde 79 MB a 106 MB. Aquí está la salida con el Monitor de proceso:

 
1:39:39.4624488 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,390,069, Length: 17 
1:39:39.4624639 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,390,069, Length: 17 
1:39:39.4624838 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,388,032, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 
1:39:39.4633839 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,417,269, Length: 17 
1:39:39.4634002 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,417,269, Length: 17 
1:39:39.4634178 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,444,469, Length: 17 
1:39:39.4634324 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,444,469, Length: 17 
1:39:39.4634529 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,441,280, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 
1:39:39.4642199 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,471,669, Length: 17 
1:39:39.4642396 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,471,669, Length: 17 
1:39:39.4642582 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,869, Length: 17 
1:39:39.4642764 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Operation: Read, Offset: 9,498,869, Length: 17 
1:39:39.4642922 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizons\BaseName3D_1\RR_AP SUCCESS Offset: 9,498,624, Length: 32,768, I/O Flags: Non-cached, Paging I/O, Synchronous Paging I/O, Priority: Normal 

Aviso lee el extra de 32.768 con I/O Banderas fijadas a sin almacenamiento en caché, de paginación de E/S, síncrono de paginación de E/S, Prioridad: Normal. Estas lecturas extra son las que lo llevan de 272 KB a 106 MB y están causando la lentitud. No ocurren cuando se lee de un archivo local o si estoy leyendo una fila, así que todo es secuencial.

He intentado configurar el FILE_FLAG_RANDOM_ACCESS pero no parece ayudar. ¿Alguna idea sobre qué está causando estas lecturas extra y cómo hacer que se detengan?

Las pruebas se están ejecutando en un sistema Vista de 64 bits. Puedo proporcionar el código fuente de un programa para demostrar el problema, así como un programa de consola que hace las pruebas.

+1

Quizás pueda pegar la parte del código en el que realiza la lectura. Eso descartaría algún error de codificación, que son más comunes que los errores de plataforma :-) – Ariel

Respuesta

2

Es posible que se encuentre con problemas de bloqueo de operación sobre smb. Por lo general, al leer/guardar un archivo en la red, Windows pasará el archivo completo al trabajo del cliente y enviará los cambios. Cuando trabaje con archivos o bases de datos de archivos planos, puede causar lecturas innecesarias en un recurso compartido de archivos smb.

No estoy seguro de si hay una manera de simplemente pasar todo el archivo, leer las filas de ese archivo en la copia local y luego rechazar los cambios o no.

Leerá algunas pesadillas sobre oplocks y bases de datos de archivos sin formato.

http://msdn.microsoft.com/en-us/library/aa365433%28VS.85%29.aspx

No estoy seguro si esto resuelve su problema, pero podría conseguir que apunta en la dirección correcta. ¡Buena suerte!

0

Veo esto todo el tiempo, y está fuera de tu control: la red hace lo que quiere.

Si sabe que el archivo va a ser inferior a 1 MB, simplemente meta todo en la memoria.

0

Supongo que el sistema operativo está haciendo su propia lectura anticipada del archivo en caso de que necesite los datos en un momento posterior. Si no te está lastimando, entonces no debería importar.

Consulte la sección caching behavoir de la API CreateFile.

Puede probar el 'FILE_FLAG_NO_BUFFERING' para ver si detiene las lecturas extra. Tenga en cuenta que, utilizando esta bandera puede ralentizar su aplicación. Normalmente, utiliza este indicador si comprende cómo transmitir datos del disco lo más rápido posible y el almacenamiento en caché del sistema operativo solo se interpone en el camino.

También puede obtener el mismo tipo de comportamiento que el archivo de red con archivos locales si usa el indicador 'FILE_FLAG_SEQUENTIAL_SCAN'. Esta sugerencia de indicador le indica al administrador de caché de Windows qué hará y tratará de obtener los datos por usted con anticipación.

0

Creo que SMB siempre transfiere un bloque, en lugar de un pequeño conjunto de bytes.

Puede encontrar algo de información sobre la negociación del tamaño de bloque aquí. http://support.microsoft.com/kb/q223140

Por lo tanto, está viendo una lectura para copiar el bloque correspondiente, seguido de la (s) lectura (s) local (es) de 17 bytes dentro del bloque. (Si observa el patrón, hay algunos pares de lecturas de 17 bytes donde dos lecturas caen dentro del mismo bloque).

La corrección obviamente depende del control que tenga sobre la aplicación y el tamaño y la estructura de la base de datos. (Por ejemplo, si la base de datos tiene una columna por archivo, todas las lecturas serán secuenciales. Si utilizó un servidor de base de datos, no estaría utilizando SMB, etc.)

Si le sirve de consuelo, iTunes performs abysmally when using a network drive too.

2

Encontré la respuesta a esto. Windows hace lecturas de archivo a través del caché de la página, por lo que cuando leo 17 bytes, primero tiene que transferir una página completa de 32K y luego puede copiar los 17 bytes que quiero de la memoria caché de la página. Desagradable resultado en el rendimiento!

Lo mismo ocurre realmente la primera vez que las lecturas se realizan en un archivo local, ya que en ese caso todavía carga una página completa a la vez en la caché de la página. Pero la segunda vez que ejecuto la prueba localmente, los archivos ya están en el caché de la página, así que no lo veo. Y si SuperFetch está encendido y he estado haciendo estas pruebas por un tiempo, Windows comenzará a cargar el archivo en el caché antes de Incluso ejecuto mi aplicación de prueba, así que de nuevo no veo que se realicen las lecturas de la página.

¡De modo que el sistema operativo está haciendo muchas cosas entre bastidores que hace difícil obtener buenas pruebas de rendimiento!

Cuestiones relacionadas