2011-12-23 4 views
1

データを処理するスレッドが多数あるアプリケーションがあります。この処理の一環として、小さなファイルをネットワーク共有に書き込んでいます。私は、次のコードを使用してFileStreamを作成します。C#FileStreamをネットワーク共有に作成するマルチスレッドアプリケーションが遅い

using (var fileStream = new FileStream("\\server\path\etc", FileMode.Create, FileAccess.Write, FileShare.None)) 

(毎秒100個のファイルの下の書き込み)高負荷の下での、のFileStreamの作成は(60秒以上)時間がかかることがあります。これは、アプリケーションが高負荷で数分間実行された後に発生します。

FileStreamの作成時にスレッドをブロックするものがなければなりません。おそらくスレッドがブロックされてファイル共有への接続を作成しようとしていると思いました。プロセスエクスプローラでプロセスをチェックしましたが、ファイルサーバーへのTCP接続が見つかりませんでした。だから私は、ファイルサーバーへのSMB接続がTCPではないと推測しています。

問題が何であるか、より良いパフォーマンスを達成するために私がやり方を変える方法はありますか?

+0

これをローカルで試してみましたか?ロジックにエラーがあるのか​​、それとも真のネットワークであるのかを確認する問題 – MethodMan

+0

良い点。私はこれをローカルで試してみて、同じ遅延があるかどうか確認してください。私はちょうどそれがファイル共有に書いていなければならないと仮定した。 – Mas

+0

ローカルパスへのパスを指定しようとしましたが、このパフォーマンスの問題は存在しません。奇妙なのは、ファイル共有への書き込みがうまくいくことです。私は、このファイル共有は他の人にも使われているサーバーなので、この問題は他のユーザーからこのサーバーに多くの負荷がかかる場合にのみ発生する可能性があります。しかし、これによってFileStreamの作成が遅くなるのでしょうか? – Mas

答えて

1

このKBの記事に記載されている問題が発生している可能性があります。Shared file access is delayed if the file is open on another computer私は個人的に30秒間ブロックするためにMicrosoft Accessを見ました。なぜなら、30秒ごとに操作を再試行したためです。おそらく、これはこの問題の延長線上にあるものです。

あなたがネットワーク経由でWindows NT を実行しているコンピュータ上のファイルを開こうとすると、ファイルが が制限を共有している別のクライアントコンピュータ上で開いている場合は、前に約1秒 の遅延があります共有違反エラーメッセージが返されます。クライアント アプリケーションがサーバー上のいくつかのファイルにアクセスしている場合、この遅延 が重要になることがあります。これらの現象は、共有データベースファイルを持つJetデータベースエンジン など、マルチユーザーのファイルベースのアプリケーション で簡単に確認できます。

まず、ローカルファイルを試してみて、何が起こるかを見てみましょう。

+0

ファイルは一意の名前で新しく作成され、書き込まれた後、FileStreamが閉じられたため、確実に共有されません。しかし、これは知るべき良い情報です。 – Mas