問題タブ [servicepoint]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - マススレッド化された HTTPWebRequests は CPU を浪費します
.net を使用して約 10.000 の同時要求を実行したいHttpWebRequest
のですが、すべてが同じホストに送信されるわけではなく、プロキシのプールを経由するものもあります。
現在、最大 1000 の同時リクエスト (タスク マネージャーでは約 3% に相当) まで正常に動作するスレッドを使用していますが、2000 または 5000 の同時リクエストにスケールアップすると、多くの例外 (以下を参照) と 100% の CPU 負荷が発生します。
サーバーには多すぎると思ったのですが、たとえば 1000 の同時実行で 2 つのインスタンスを実行することもできるので、接続管理で何かを推測しています。
まず最初に: リクエストのサンプル コード (問題ないと思いますが、大規模になるまで問題なく動作します)
そしてもちろん、私は(私だと思います) ServicePointManager も正しく設定しました:
奇妙なことに、アプリケーションが接続の制限の半分を使用していない場合でも、タイムアウトが発生します(実際のタイムアウトはありません。DefaultConnectionLimit が低く、要求を並列にしようとしたときに発生するようなタイムアウトです)。
そこで、ConnectionGroupName を使用して、各スレッドに一意の接続を与えることにしました。
これにより、少なくとも開いている TCP 接続が増加したため、.NET を拡張しただけでなく、このhttp://kb.globalscape.com/KnowledgebaseArticle10438.aspxDefaultConnectionLimit
のようなウィンドウで使用可能な動的 TCP ポートも増加しました。アプリは非常に多くの接続を開くようになりましたが、これは必要ありませんが、CPU のフッテージが高く、タイムアウトすることはめったにありません (ただし、以前よりもはるかに優れているため、接続管理に何か問題があるのでしょうか?)。
完全を期すために:私は時々これらの例外も取得します(ただし、それほど頻繁ではありません):netsh int ipv4 set dynamicport tcp start=1025 num=50000
だから私の質問は、どうすればこれを解決できますか? 私は間違っていましたか?回避策はありますか? 自分で接続を管理できますか? この場合にうまく機能する別のクラス/言語はありますか? 等
c# - HttpWebRequest の実際の開始を検出する
のTAP パターンAPI を使用して作成された Web クローラーですHttpWebRequest
。
からいくつかのものをダウンロードしたいのですがhttp://somedomain.tld
、かなりの数のリクエストを送信することになるかもしれません。がタイムリーに応答するかどうかはわかりませんsomedomain.tld
。応答の返送が完了するまで、要求ごとに 10 秒以内に収めたいと考えています。ServicePoint
また、そのドメインに対してによって適用される接続制限も利用したいと考えています。
そのため、リクエストでタイムアウトできる必要があります。通常、次からキャンセル トークンを取得しますCancellationTokenSource
。
それを非同期操作に提供し、おそらく を呼び出すキャンセル コールバックも登録するmyWebRequest.Abort()
ので、最終的には次のような (簡略化された) メソッドになります。
ここまでは順調ですね。
少し制限させてください。
現在、ServicePoint
関連付けられているインスタンスsomedomain.tld
は、一度に 1 つのリクエストのみを許可します。
ここで、2 つのリクエストを同時に送信します。これによりServicePoint
、ターゲット ドメインが私の悪用から隔離されることがわかっているので安全です。
ここで、最初のリクエストが完了するまでに 10 秒以上かかると仮定しましょう...ServicePoint
一度に 1 つのリクエストのみを起動するように制約しているため、ServicePoint
が 2 番目のリクエストを起動するまでに、それはすでにキャンセルされており、中止されました。
では、リクエストが実際にいつ送信されているかを知るにはどうすればよいでしょうか? ServicePoint
特定のリクエストに関するのアクションを「認識する」タイムアウトを設定するにはどうすればよいですか?
vb.net - ASP.NET 「要求が中止されました: SSL/TLS セキュア チャネルを作成できませんでした」は、構成された servicepointmanager でも発生します。
この画像をリクエストしようとして います。問題の SSL 証明書を引き続き表示できます。ブラウザーを使用して、ページに正常に移動し、画像を要求して、有効な SSL 証明書を表示することができました。
ここで確認しました:リクエストが中止されました: SSL/TLS セキュア チャネルを作成できませんでした
だから私は自分のコードにそのソリューションを追加しました:
私は試した:
しかし、その後エラーが発生します:
'Tls12' is not a member of 'System.Net.SecurityProtocolType'
そして
'Tls11' is not a member of 'System.Net.SecurityProtocolType'
また、Windows が 512 ビットの DHE をブロックしないようにレジストリを変更しようとし、下に 0x00000200(512) 値の ClientMinKeyBitLength を追加しました。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\Diffie-Hellman.
しかし、それでも失敗します...なぜですか?
c# - BindIPEndPointDelegate を使用して異なる IP をバインドする webrequests では、マルチスレッドで同じホストに対して複数の ServicePoint が発生しない
カテゴリー:
スループットの増分
シナリオ:
複数の HttpWebRequestを、異なるイーサネット アダプターを介して同じホストに送信する必要があります。
覚えておくべきキー:
- リクエストは同じホストに送信されます。
- サービスポイントとして、ホストごとに組み込みの制限があります。
- System.Net.ServicePointManager.DefaultConnectionLimit を 100 に設定する (たとえば) か、同じ uri を持つ webrequest オブジェクトに対して webRequest.ServicePoint.ConnectionLimit = 50 を設定することによって、ホストへの同時リクエストの数を活用できます。 ソース:
サンプルコード:
Gist (Target Framework .Net 2.0) を完了します。
やってみたいです:
webreq1 ----- 経由で送信 ------- eth1
webreq2 ----- 経由で送信 ------- eth2
webreq3 ----- 経由で送信 ---- --- eth3
何が起こっている:
- webreq1 --- 接続を介して送信する場合 ---- eth1
- webreq2 -- 接続経由で送信 ---- eth1 (これは eth2 にバインドされています)
- webreq3 -- 接続経由で送信 ---- eth1 (これは eth3 にバインドされています)
- webRequest.ServicePoint.GetHashCode() は、すべての Web リクエストに対して同じハッシュを提供します。
問題 (未解決):
- 各 Webrequest は同じ servicepoint を使用していますが、HttpWebRequest ごとに ServicePoint の BindIPdelegate を介して異なるイーサネット接続を使用するように明示的に設定されています。
問題 (解決済み):
- 異なるスレッドの Web リクエストから同じホストへの複数のリクエスト。(servicepoint.ConnectionLimit を設定することで解決)(上記のソース)。
さらなる解決策 (解決されない場合は実装予定):
- Raw ソケットの使用。
- 同じ servicemanager-servicepoint シナリオに依存する場合、このソリューションは機能しない可能性があります。
要求された提案。よろしく。デブプラシャント。
.net - .net デバッグ ツールを使用して ServicePoint の制限の間違った設定によってブロックされた HttpWebRequest/Response または Connections を見つける方法
今日、問題が発生しました。本番 Web サーバーの iis 接続が非常に高く、CPU とメモリは通常のレベルにあります。Zabbix (オープンソースの監視ソフトウェア、サーバー/パフォーマンス カウンターからデータを収集し、Web 上に表示) から、多くの「ASP.NET Requests Queued (パフォーマンス カウンター)」が表示されます。サーバーからダンプを取得します。DebugDiag2.2 を使用して、ダンプを自動的に分析します。それは次のように報告しています。
このスレッドは HttpWebRequest を作成し、リモート サーバーからの応答を待機しています。これらの要求の 1 つ以上が、使用可能な接続の最大数の少なくとも半分を使用しています。
警告、利用可能な接続の少なくとも半分が使用されています
HttpRequest URI: http://ws.product.aaa.bbb.com/product.search/api/x-protobuf/SearchData ServicePoint - ConnectionLimit:32 CurrentConnections:31
しばらくグーグルで検索すると、「asp-net-performance-case-study-web-service-calls-taking-forever」と「.NET で Web リクエストを作成するときのタイムアウト」のリンクが見つかります。
私のサーバーは .net 4 を使用しています。手順に従って、Zabbix で描画された iis 接続である waitList をダンプしようとしています。
ウエストリストを見つけましたが、サイズが 0 です。
foreach ループを使用してすべての待機リストをダンプします。
出力では、_size=0 および _items =000000d43805cb70 です。
今のところ、「Queued Requests」がどこにあるのかわかりません。調べるのを手伝ってくれませんか?