在对某些源代码进行性能分析时,我注意到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读取响应
答案 0 :(得分:1)
它肯定在扫描某些东西......实际上是病毒扫描。一旦我关闭了我的病毒扫描程序并重复测试,行为就消失了。显然,实时保护会在给定进程中打开每个文件时对其进行扫描。它可以做的最少的是更新本地缓存;)
这个问题让我们暂时困扰了一段时间。它表明我发布问题后的第二天,答案就在我们的圈数中。无论如何,我希望这有助于其他人。
答案 1 :(得分:0)
您可以尝试一些CreateFile
标记选项:FILE_FLAG_RANDOM_ACCESS
和/或FILE_FLAG_OPEN_NO_RECALL
。 FILE_FLAG_NO_BUFFERING
也可能有所帮助,但它需要部门对齐的I / O.
较新版本的Visual Studio将fopen模式字符串中的R
映射到FILE_FLAG_RANDOM_ACCESS
。