一部のソースコードでパフォーマンス解析を行っているときに、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リードレスポンス
'FILE_FLAG_OVERLAPPED'を試してみる価値があるかもしれません(ただし、I/Oセマンティクスが大きく変わることに注意してください)。 –
提案をいただきありがとうございます!私はこれらのオプションをすべて試しましたが、私はまだ同じ動作をします。最初に、SMB2パケットは、ファイルの最初の64kデータブロックを読み取って、* last * 64kブロックだけ進んだ後、データブロック2 * 64kにジャンプして4MBの範囲まで進んでいくことを示しています。まるでそれが何かをスキャンしているかのように。次に、CreateFile呼び出しの後、ファイル内の最初の1kブロックのデータのReadFile呼び出しを実行しました。何だと思う? SMB2読み取りコマンドをスローします。言い換えれば、キャッシュに読み込んでいた場合、なぜそれが再び配線を通過したのでしょうか? –