2

私はこのようにプログラムを設定しています。これは、.NetFramework4コンソールアプリです。このプログラムは、各サーバー上のすべてのログファイル(前週から)からscバイトとcsバイトを収集するために使用されます。このプログラムは終了しましたが、実行に非常に長い時間がかかります。

foreach (string server in servers)
            {

                foreach (string website in Directory.GetDirectories(server))
                {

                    foreach (string file in Directory.GetFiles(website))
                    {

スレッドやPLINQのようなものを使用してプロセスを高速化できるかどうか疑問に思っていましたか?これでパフォーマンスが向上する場合は、ログファイルごと(または各Webサイト)に新しいスレッドを作成するのは論理的ではないように思われるため、実装するのに最適な方法がわかりません。スレッドの数が多いとパフォーマンスが向上しないことは明らかです。

さらにコードを表示する必要がある場合は、質問してください。ただし、このプログラムは基本的に、過去7日以内に作成された各ファイルの各行を読み取り、バイト番号を追加してから、ディレクトリエントリを使用して(IDから)Webサイト名を取得します。 、次に、各Webサイトの名前と合計バイト数をテキストファイル(最終的には代わりにデータベースになります)に出力します。実際のコードは必要ありません。パフォーマンスを向上させるための最善の方法(可能な場合)についてアドバイスするだけです。

ありがとう。

4

6 に答える 6

4

このようなIOバウンドタスク(ディレクトリとファイルを繰り返し処理して読み取る)では、ボトルネックはCPUではなくディスクIOです。

並列化(?)すると、速度が向上する可能性は低く、パフォーマンスが低下する可能性もあります。

于 2012-06-08T18:42:06.927 に答える
1

サーバーが異なるマシン上のディスクである場合、各サーバーからの要求ディレクトリとファイルを並列化するとパフォーマンスが向上します。これは、1つのサーバーが1つのスレッドで実行され、1000台のサーバーが10のスレッドで実行されている可能性があります。プログラムはIOを多く待機し、ネットワーク帯域幅がボトルネックになる可能性があります。より良いアプローチは、各サーバーにWebサービスを配置してカウントを実行し、各Webサービスに結果を要求することです。このようにすると、ネットワークがボトルネックになることはなく、Webサービスに質問したときに回答がわかっているようにすることもできます(ファイルシステムウォッチャーを使用している可能性があります)。

于 2012-06-08T18:58:17.907 に答える
0

複数の同時スレッドを使用するとパフォーマンスが向上するかどうかは、実際に実行される「処理」に依存します。あなたの説明から、あなたはI / Oバウンドである可能性が高いので、マルチスレッドはあまり役に立たないか、さらに悪いかもしれません。

したがって、自分で測定しない限り、答えは間違いなく「たぶん」です。ここで重要なのは測定です。

于 2012-06-08T18:42:16.787 に答える
0

答えはいくつかの事柄に依存します:クライアントプログラムを実行しているマシンが持っているCPUの数、サーバーごとのログチェックが各サーバーのログフォルダに直接入っているか、各サーバーのすべてのディレクトリをチェックしているか(もしそうならどのように)大きなファイルシステムはサーバー上にあります)、そしてフォルダーがどれだけ深くなるかは、コードの断片でDirectory.GetDirectoriesを介しておそらく再帰的です。

このタスクの実行には「非常に長い時間」かかるとおっしゃいました。いくつかの基本的なPerfmon統計といくつかのTaskManagerビューは、データを収集するときにローカルで使用されているCPUとディスクの量を判断するのに役立ちますが、思ったほどではないと思います。

.NetのSystem.Threadingを使用して複数のリモートサーバーでログを同時に処理する場合、マルチスレッドの下でさまざまなサーバーにI / O負荷がかかると、I/O負荷が分散する可能性があります。次に、異なるサーバーからこのデータを同時に収集しようとするクライアントマシンで発生する可能性のあるボトルネックは、クライアントマシンがスレッドをマルチプロセスする必要があるCPUの数と、ネットワークパスを介して回答を受信するために提供できるネットワーク帯域幅によって決まります。同時にさまざまなサーバー。

于 2012-06-08T19:09:14.267 に答える
0

ファイルシステムは、データ、特にディレクトリやファイル情報などへのアクセスをキャッシュします。したがって、PLINQのようなものを使用すると、パフォーマンスがわずかに向上することがわかります。しかし、コンソールアプリでは、私は実際にはその要点を理解していません。パフォーマンスとパフォーマンスの認識が重要である場合、この種のことは、進行とキャンセルを伴うGUIで実行されます...

しかし、あなたが投稿したコードについてはいくつか質問があると思います。Webサイトからファイルを取得しますか?そのためには、別のサーバーへの有線の何らかの要求が必要になります。操作は非同期で行うことをお勧めします。しかし、あなたはそれをどのように行うかを提案するための詳細を誰にも提供していません。

于 2012-06-08T19:11:37.840 に答える
0

並列化は、複数のスレッドのパフォーマンスが1つのスレッドのパフォーマンスよりも優れている場合にのみ意味があります。

実際の結果は、使用しているハードウェアによって異なります。

非常に高速なネットワークがあり、データがすべてのサーバーのSSDに保存されている場合は、すべてのプロセスを並列化しようとする可能性があります。

上記の構成は、現実の世界ではまれなケースです。

通常の環境では、ネットワークの使用率を確認してください。20%未満の場合は、サーバーの並列化を試すことができます

順次読み取りは、マルチスレッド読み取りと比較してHDD(SSDではない)の方がはるかに高速であるため、ネストされたループの並列化が役立つ可能性はほとんどありません。

PSネットワークを100%利用しようとしないでください。あなたのITはそれについて満足しません。

于 2012-06-08T20:20:26.560 に答える