【问题标题】:Reading file over network slow due to extra reads由于额外的读取,通过网络读取文件很慢
【发布时间】:2011-01-03 13:25:51
【问题描述】:

我正在读取一个文件,我读取一行数据(1600 次连续读取 17 字节)或一列数据(1600 次读取 17 字节,以 1600*17=27,200 字节分隔)。该文件位于本地驱动器或远程驱动器上。我读取了 10 次,因此我希望每次读取 272,000 字节的数据。

在本地驱动器上,我看到了我的期望。在远程驱动器上按顺序阅读时,我也看到了我的期望,但是在阅读一列时,我看到大量额外的阅读正在完成。它们长 32,768 字节,似乎没有被使用,但它们使读取的数据量从 272,000 字节跃升至 79 MB 到 106 MB。这是使用进程监视器的输出:

1:39:39.4624488 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP SUCCESS 偏移量:9,390,069,长度:17 1:39:39.4624639 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,390,069,长度:17 1:39:39.4624838 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功偏移:9,388,032,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常 1:39:39.4633839 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP SUCCESS 偏移量:9,417,269,长度:17 1:39:39.4634002 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,417,269,长度:17 1:39:39.4634178 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP SUCCESS 偏移量:9,444,469,长度:17 1:39:39.4634324 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,444,469,长度:17 1:39:39.4634529 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功偏移:9,441,280,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常 1:39:39.4642199 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP SUCCESS 偏移量:9,471,669,长度:17 1:39:39.4642396 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,471,669,长度:17 1:39:39.4642582 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP SUCCESS 偏移量:9,498,869,长度:17 1:39:39.4642764 PM DiskSpeedTest.exe 89628 FASTIO_CHECK_IF_POSSIBLE \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功操作:读取,偏移:9,498,869,长度:17 1:39:39.4642922 PM DiskSpeedTest.exe 89628 ReadFile \\BCCDC01\BCC-raid3\SeisWareInc Temp Dir\BPepers_Temp\Projects\PT_4\Horizo​​ns\BaseName3D_1\RR_AP 成功偏移:9,498,624,长度:32,768,I/O 标志:非缓存,分页 I/O,同步分页 I/O,优先级:正常

注意 32,768 的额外读取,其中 I/O 标志设置为非缓存、分页 I/O、同步分页 I/O、优先级:正常。这些额外的读取将它从 272 KB 带到 106 MB 并导致缓慢。从本地文件读取或读取一行时它们不会发生,所以它们都是连续的。

我已经尝试设置 FILE_FLAG_RANDOM_ACCESS 但它似乎没有帮助。关于导致这些额外读取的原因以及如何使它们停止的任何想法???

测试在 Vista 64 位系统上运行。我可以提供用于演示问题的程序的源代码以及进行测试的控制台程序。

【问题讨论】:

  • 也许您可以粘贴您阅读的代码部分。这将排除一些编码错误,这些错误比平台错误更常见:-)

标签: windows performance file smb


【解决方案1】:

我找到了答案。 Windows 通过页面缓存读取文件,因此当我读取 17 个字节时,它首先必须传输 32K 的完整页面,然后可以将我想要的 17 个字节从页面缓存中复制出来。性能上的糟糕结果!

第一次读取本地文件时实际上会发生同样的事情,因为在这种情况下,它仍然一次将整个页面加载到页面缓存中。但是我第二次在本地运行测试时,文件都已经在页面缓存中,所以我看不到它。如果启用 SuperFetch 并且我已经进行了一段时间的这些测试,Windows 将开始将文件加载到缓存中之前我什至运行我的测试应用程序,所以我再次看不到页面正在读取。

所以操作系统在幕后做了很多事情,这使得很难完成良好的性能测试!

【讨论】:

    【解决方案2】:

    我认为 SMB 总是传输一个块,而不是一小组字节。

    可以在此处找到有关块大小协商的一些信息。 http://support.microsoft.com/kb/q223140

    因此,您会看到复制相关块的读取,然后是块内 17 个字节的本地读取。 (如果你看一下这个模式,有一些 17 字节读取对,其中两个读取位于同一个块中)。

    修复显然取决于您对应用程序的控制以及数据库的大小和结构。 (例如,如果数据库每个文件有一列,那么所有读取都是顺序的。如果您使用数据库服务器,则不会使用 SMB 等)

    如果有什么安慰的话,iTunes performs abysmally when using a network drive too。

    【讨论】:

      【解决方案3】:

      我的猜测是,操作系统正在对文件进行自己的预读,以防您稍后需要数据。如果它没有伤害到你,那就没关系。

      查看 CreateFile API 的 caching behavoir 部分。

      您可能想尝试“FILE_FLAG_NO_BUFFERING”,看看它是否会停止额外的读取。请注意,使用此标志可能会减慢您的应用程序的速度。通常,如果您了解如何尽可能快地从磁盘流式传输数据并且操作系统缓存只会妨碍您,则通常使用此标志。

      如果您使用 'FILE_FLAG_SEQUENTIAL_SCAN' 标志,您也可以获得与具有本地文件的网络文件相同的行为。此标志提示 Windows 缓存管理器您将要做什么,并将尝试提前为您获取数据。

      【讨论】:

        【解决方案4】:

        我经常看到这种情况,但这是你无法控制的:网络会做它想做的事。

        如果您知道文件将小于 1MB,只需将整个文件拉入内存即可。

        【讨论】:

          【解决方案5】:

          您可能会在 smb 上遇到操作锁定问题。通常,当通过网络读取/保存文件时,windows 会将完整文件拉到客户端工作并发送回更改。当您使用平面文件数据库或文件时,可能会导致对 smb 文件共享进行不必要的读取。

          我不确定是否有办法只提取整个文件,从本地副本上的该文件中读取行,然后将更改推回。

          您会读到一些关于 oplock 和平面文件数据库的噩梦。

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

          不确定这是否能解决您的问题,但它可能会为您指明正确的方向。祝你好运!

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-05
            • 1970-01-01
            • 2021-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-28
            • 1970-01-01
            相关资源
            最近更新 更多