0

parallel.for と parallel.foreach を使用して、さまざまなページを並行してダウンロードするクローラーボットがあります。MaxDegreeOfParallelism は約 20 に設定されています。これを増やしてもパフォーマンスはさらに向上しないようで、Web サーバーに過負荷をかけたくないからです。

ASP.NET Web サイト (すべての場所) からクロールを開始すると、許容できるパフォーマンスで実行され、すべて数時間かかります。このセットアップの設計上の問題により、代わりにコンソールから起動できるようにこれを変更しています。

必要なコードはすべて、Web サイトとコンソール アプリの両方からアクセスできる dll にあります。

起動メッセージを除いて、コンソールへの出力はありません。

問題は、これをコンソール (またはデバッガー) から実行すると、ASP.NET Web サイトから実行する場合よりも約 10 倍長く (!) かかることです。ASP.NET のバージョンがコンソールよりも遅い場合は、理解しやすいと思います。

これはなぜですか、またはこれをデバッグしたり、その理由を見つけたり、問題を修正したりするにはどうすればよいですか?

編集: これは、Visual Studio デバッガーを使用して両方のバリアントを試すときにも発生します。「デバッグ」から「出力」ウィンドウへの出力は、次のようになります。

スレッド '' (0x1d34) はコード 0 (0x0) で終了しました。スレッド '' (0xf20) はコード 0 (0x0) で終了しました。スレッド '' (0x3414) はコード 0 (0x0) で終了しました。スレッド '' (0x35c8) はコード 0 (0x0) で終了しました。スレッド '' (0xdc) はコード 0 (0x0) で終了しました。スレッド '' (0x1c98) はコード 0 (0x0) で終了しました。スレッド '' (0x3308) はコード 0 (0x0) で終了しました。スレッド '' (0x2b00) はコード 0 (0x0) で終了しました。スレッド '' (0x2f7c) はコード 0 (0x0) で終了しました。スレッド '' (0x345c) はコード 0 (0x0) で終了しました。スレッド '' (0x2a18) はコード 0 (0x0) で終了しました。スレッド '' (0x138) はコード 0 (0x0) で終了しました。スレッド '' (0x3650) はコード 0 (0x0) で終了しました。スレッド '' (0x376c) はコード 0 (0x0) で終了しました。

ただし、ASP.NET の場合、このテキストは約 10 倍高速に書き込まれます。

ダウンロードされたページごとに dll が COM 経由で 7zip を呼び出して圧縮することにも言及する価値があるかもしれません。

4

1 に答える 1

2

同じサーバーから多くのページをダウンロードしている場合は、によって設定された制限に達しますServicePointManager.DefaultConnectionLimit。デフォルト値は通常 2 ですが ( HTTP 1.1 RFC で提案されているように)、ASP.NET アプリケーションの場合は 10 のようです。別の数値が表示されている場合は、何かがデフォルト値を変更した可能性があります。

この制限に達すると、フレームワークはその特定のサーバー (または「エンドポイント」) への接続を確立しなくなるため、ほとんどのスレッドは何もしないことをブロックします。

の値を変更することでこれを修正できますDefaultConnectionLimitが、より良い解決策は、同じサーバーに対して多くの同時リクエストを行わないように、リクエストの順序を変更することです。

于 2013-03-17T16:14:24.557 に答える