在随机访问文件后,顺序访问网络服务器上的文件时的性能

Ner*_*ron 5 c++ windows mfc file windows-server-2008

我正在使用Windows 7上的本机C++/Win32/MFC应用程序.我正在使用CFile打开存储在远程服务器上的文件(带有标志,CFile :: modeRead | CFile :: shareDenyWrite).服务器正在运行Windows Server 2008,我通过常规Windows文件共享访问共享驱动器上的文件.一旦我打开文件,我就按照下面的描述阅读它.

首先,我正在寻找文件中的多个位置(10个位置)和读取小(128个字节)的部分.然后,我正在寻找开头并顺序阅读整个文件.

我注意到的是,执行上述操作比打开文件并通读它要慢得多.初始随机搜索和采样非常快,即使使用大文件也几乎是即时的.有趣的是,即使这很快,下一部分,扫描文件的速度非常慢,而只是在没有初始随机访问的情况下进行扫描.

在试图弄清楚发生了什么时,我拉起了性能监视器并观察了网络流量.如果我只是通过文件执行顺序读取,我通过无线适配器下载3.5MB/s.如果我首先随机搜索,那么顺序读取我在顺序读取期间只获得300kB/s.

解决方案是在执行随机访问部分后关闭并重新打开文件.当我这样做时,顺序读取加速.

所以似乎做随机访问读取(搜索和读取)在服务器上做了一些事情,然后导致顺序读取缓慢.我想知道,有没有人知道这里发生的事情是什么,我看到的行为的实际原因是什么?虽然我已经解决了这个问题,但我想更好地了解引擎盖下发生的事情.

Dav*_*rtz 7

Mooing Duck的评论是正确的.操作系统开始假设顺序访问为"软"选项 - 启用直到被证明有害.但是随机访问导致预读使性能变差,并且"智能"缓存行为会提前读取.

你会认为一些顺序访问会导致Windows重新打开它.但不幸的是,此时旗帜不再"软".Windows认为从那时起就证明了随机访问,就像你强迫它进入那种模式一样.

您可以通过CreateFileFILE_FLAG_SEQUENTIAL_SCAN选项强制它继续预读,无论如何.但是你重新开放的解决方案可能与任何东西一样好.如果你不CreateFile直接打电话,这是唯一的方法.

  • @Nerdtron是的,它会,但不多.Windows将在每次访问时读取额外的字节.如果他的网络很长而且很胖(延迟通常比带宽更有限),那么它将非常重要. (2认同)