6

私は、あるタイプのメッセージがデータベースに到達し、他のタイプのメッセージが外部のxmlapiに到達する必要があるアプリケーションに取り組んでいます。

多くの処理を行う必要があります...大きな課題の1つは、HttpWebRequestクラスを適切に実行することです。私は最初、標準の同期メソッドを使用し、すべてをスレッドプールすることから始めました。これは良くありませんでした。

したがって、少し読んだ後、これを行うための推奨される方法は、Begin / Endメソッドを使用して作業をIO完了ポートに委任することであることがわかりました。これにより、スレッドプールが解放され、パフォーマンスが向上します。これは当てはまらないようです...パフォーマンスはわずかに向上していますが、スレッドプールと比較して、IO完了ポートがそれほど使用されていることは確かにわかりません。

回転して、利用可能なワーカースレッドとスレッドプール内の完了ポートを送信するスレッドがあります。完了ポートは常に非常に低く(私が見た最大は9が使用されています)、常に約120のワーカースレッド(場合によってはそれ以上)を使用しています。のすべてのメソッドに開始/終了パターンを使用しますhttpwebrequest

Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)

私はそれを正しくやっていますか?私は何かが足りないのですか?(netstat出力から)最大2048のhttp接続を同時に使用できます(netstat出力から)-完了ポート番号が非常に少ないのはなぜですか?

誰かがこの管理ワーカースレッド、完了ポートをうまく処理する方法について真剣なアドバイスを与えることができれば、httpwebrequestそれは非常にありがたいです!

編集:.NETはこれに適したツールですか?.NETおよびSystem.Netスタックで動作する大量のhttpconnectionsを取得できますか?WinHttp(または他のC ++ライブラリ)のようなものを使用し、.NETからpInvokeすることをお勧めしますが、これは私が特にやりたいことではありません!

4

3 に答える 3

6

私の理解では、非同期要求が未処理である間は常にI / O完了ポートを拘束するわけではありません。データが返され、対応するスレッドで処理されている場合にのみ「ビジー」になります。うまくいけば、コールバックで行う作業があまりないので一度に多くの使用中のポートがありません。

しかし、実際にはパフォーマンスが低下していますか?あなたの懸念の原因は単に少数ですか?期待するスループットが得られていますか?

問題の1つは、1つのホストのHTTP接続プールが比較的小さいことです同じマシンに対して何百ものリクエストがある場合、デフォルトでは、DoSが問題のホストを攻撃するのを避けるために(そしてキープアライブの利点を得るために)、デフォルトでは一度に2つのリクエストのみが行われますこれは、プログラムで、またはapp.configを使用して増やすことができます。もちろん、これはあなたの場合には問題ではないかもしれません。なぜなら、あなたはすでに問題を修正しているからか、あなたのすべての要求が異なるホストに向けられているからです。(netstatが2048の接続を示している場合、それは悪くないように聞こえます。)

于 2011-01-24T07:28:35.953 に答える
0

たぶん、EndReadメソッドは、結果をスレッドセーフキューにのみ書き込み、そのキューを、制御下にある少数のワーカースレッドから読み取る必要があります。および/または、HttpWebRequestが完了すると待機可能オブジェクトに信号を送り、単一(または少数)のスレッドからのすべての未処理の要求を待機する独自のロジックを作成するという事実を使用します。

于 2011-01-26T14:01:20.037 に答える
0

完了ポートスレッドが9つしかないということは、実際にはそれらを正しく効率的に使用していることを意味します。実行しているマシンには8コアまたは4ハイパースレッドコアがあると想定します。つまり、OSは常に最大8つのアクティブな(スリープ/ブロック/待機ではない)完了ポートスレッドを維持しようとします。

実行中のスレッドの1つが非アクティブになり(スリープ/ブロック/待機)、処理する追加の作業項目がある場合、アクティブなカウントを8に保つために追加のスレッドが作成されます。9つのスレッドが表示されている場合は、完了ポートスレッドのメソッドに実質的にブロッキングを導入せず、実際にそれらを使用してCPU作業を実行します。

8つのスレッドが8つのコアでCPUバウンド作業をアクティブに実行している場合、スレッドを追加すると速度が低下するだけです(スレッド間のコンテキスト切り替えは無駄な時間になります)。

あなたが調べなければならないのは、なぜあなたがに120のスレッドを持っているのか、そしてそれらが何をしているのかということです。

于 2011-02-16T14:08:30.507 に答える