2017-07-17 13 views
2

一部のソースコードでパフォーマンス解析を行っているときに、CreateFileとfopenの両方がリモートファイルを完了するのに非常に時間がかかることに気付きました。C++ CreateFileとfopen関数がリモートファイル全体を先読みする

wiresharkをさらに詳しく調べると、2つの機能のどちらかを使用してファイルを開いて読み込むと、ファイルの内容全体(最大約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 386ジム\データ0 \ CRUISE_DATA.bin

SMB2 426は、要求ファイルを作成します。ファイル:Jim \ Data0 \ CRUISE_DATA.bin

SMB2 171読み出し要求レン:65536オフ:0ファイル:ジム・\データ0 \ CRUISE_DATA.bin

SMB2 1434読み取り応答

...

...

SMB2 171読み出し要求レン:65536オフ:3735552ファイル:ジム・\データ0 \ CRUISE_DATA.bin

SMB2 1434リードレスポンス

答えて

0

あなたはCreateFileのいくつかを試みることができますフラグオプション:FILE_FLAG_RANDOM_ACCESSおよび/またはFILE_FLAG_OPEN_NO_RECALLFILE_FLAG_NO_BUFFERINGも役に立ちますが、セクターに合わせたI/Oが必要です。

新しいバージョンのVisual Studioでは、Rがfopenモード文字列にFILE_FLAG_RANDOM_ACCESSにマップされています。

+0

'FILE_FLAG_OVERLAPPED'を試してみる価値があるかもしれません(ただし、I/Oセマンティクスが大きく変わることに注意してください)。 –

+0

提案をいただきありがとうございます!私はこれらのオプションをすべて試しましたが、私はまだ同じ動作をします。最初に、SMB2パケットは、ファイルの最初の64kデータブロックを読み取って、* last * 64kブロックだけ進んだ後、データブロック2 * 64kにジャンプして4MBの範囲まで進んでいくことを示しています。まるでそれが何かをスキャンしているかのように。次に、CreateFile呼び出しの後、ファイル内の最初の1kブロックのデータのReadFile呼び出しを実行しました。何だと思う? SMB2読み取りコマンドをスローします。言い換えれば、キャッシュに読み込んでいた場合、なぜそれが再び配線を通過したのでしょうか? –

1

確かに何かをスキャンしていました...実際にウイルスをスキャンしていました。ウイルススキャナをオフにしてテストを繰り返すと、その動作はなくなりました。明らかに、リアルタイム保護は、特定のプロセス内で開かれたすべてのファイルをスキャンします。できるだけ少なくてもローカルキャッシュを更新することができます;)

この問題は、しばらく私たちを悩ませました。私が質問を投稿した翌日、回答は私たちの周回に当たっていることが分かります。とにかく、これが他の人に役立つことを願っています。

関連する問題