C ++ CreateFile和fopen函数抢占式地读取整个远程文件

时间:2017-07-17 20:41:30

标签: windows visual-c++ fopen createfile

在对某些源代码进行性能分析时,我注意到CreateFile和fopen在远程文件上花费的时间非常长。

进一步深入研究wireshark,我发现当两个函数中的任何一个用于打开文件进行读取时,正在读取文件的全部内容(最多约4MB)。我还要注意,在SMB2读取操作完成之前,这两个函数都不会返回(这占用了大约99%的已用调用时间)。

反正有没有阻止这种行为?任何人都可以解释这里的情况吗?

.. ..

示例:

HANDLE h = ::CreateFile( "\\\\Server1\\Data0\\CRUISE_DATA.bin", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL );

来自Wireshark:

SMB2 426创建请求文件:Jim \ Data0 \ CRUISE_DATA.bin

SMB2 386创建响应文件:Jim \ Data0 \ CRUISE_DATA.bin

SMB2 171读取请求Len:65536 Off:0文件:Jim \ Data0 \ CRUISE_DATA.bin

SMB2 1434读取响应

...

...

SMB2 171读取请求Len:65536关闭:3735552文件:Jim \ Data0 \ CRUISE_DATA.bin

SMB2 1434读取响应

2 个答案:

答案 0 :(得分:1)

它肯定在扫描某些东西......实际上是病毒扫描。一旦我关闭了我的病毒扫描程序并重复测试,行为就消失了。显然,实时保护会在给定进程中打开每个文件时对其进行扫描。它可以做的最少的是更新本地缓存;)

这个问题让我们暂时困扰了一段时间。它表明我发布问题后的第二天,答案就在我们的圈数中。无论如何,我希望这有助于其他人。

答案 1 :(得分:0)

您可以尝试一些CreateFile标记选项:FILE_FLAG_RANDOM_ACCESS和/或FILE_FLAG_OPEN_NO_RECALLFILE_FLAG_NO_BUFFERING也可能有所帮助,但它需要部门对齐的I / O.

较新版本的Visual Studio将fopen模式字符串中的R映射到FILE_FLAG_RANDOM_ACCESS