問題タブ [iocp]
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.
connect - IOCPが受け入れて保持できる最大接続数
IOCPサーバーとクライアントのテストを行います。IOCPサーバーはクライアントの接続を受け入れ、クライアントからのデータパケットを受信するだけです。クライアントはサーバーに接続し、データパケットを無限ループでサーバーに送信します。
カウンターをセットしました。サーバーがクライアントを受け入れると増加し、ソケットが閉じられると減少します。
ここに質問があります:カウンターは32261に増加し、それ以上増加しません。サーバーはそれ以上の接続を受け入れることができません。GetLastError()は10055、WSAENOBUFを返します。
私のOSはWindowsXPで、メモリは4GBです。そして、私は非ページメモリをチェックしました。私の記憶は十分だと思います。
接続の最大数を制限するものは何ですか?最大接続数を増やすにはどうすればよいですか?
c - WSASend呼び出しの完了を受け取らないことは可能ですか?
タイトルにあるように、I / O完了ポートに関連付けられたソケットで正常 WSASend
に呼び出された場合、スレッドの終了以外の理由で完了を通知しない可能性はありますか?
完了が投稿されていないように見える奇妙な状況がありWSASend
、その結果、ソケットリークが発生します。アプリケーションは、送信がまだソケットに対して保留中であると見なし、それを解放することを拒否します。
送信コードは次のとおりです。
c++ - IOCP C++TCPクライアント
TCPIOCPクライアントの実装に問題があります。私はMacOSXにkqueueを実装したので、Windowsでも同様のことをしようとしていましたが、IOCPが最も近いと理解しています。主な問題は、GetCompetetionStatusが返されることはなく、常にタイムアウトになることです。監視するハンドルを作成するときに何かが足りないと思いますが、何がわからないのです。これは私がこれまでに得たところです:
私の接続ルーチン:(明確にするためにいくつかのエラー処理を削除してください)
送信ルーチンは次のとおりです:(わかりやすくするためにエラー処理も削除してください)
}
任意の洞察をいただければ幸いです。
c++ - GetQueuedCompletionStatus 遅延
iocp メカニズムに基づいてネットワーク通信を管理するための複雑なライブラリを作成しました。問題は、サーバーが API メソッド closesocket() を呼び出して接続を閉じると、この情報が数秒または数分遅れてクライアントに送信されることがあるということです。接続閉鎖を検出するための私のコードは次のようになります (簡略化):
なぜこうなった?バックアップサーバーに接続できるようにするには、接続の閉鎖についてすぐに知る必要があります(負荷がそれほど高くないため、切断が発生しています)。
c++ - パケット遅延変動(PDV)
私は現在、可能な限りギガビットイーサネット帯域幅を利用することを目標とするビデオストリーミングアプリケーションを実装しています
- アプリケーションプロトコルはtcp/ip上に構築されています
- ネットワークライブラリは非同期iocpメカニズムを使用しています
- LAN経由のストリーミングのみが必要です
- パケットがルーターを通過する必要はありません
これにより、多くのことが簡単になります。それにもかかわらず、パケット遅延変動の問題が発生しています。
これは、たとえば20ミリ秒ごとに到着するはずのビデオフレーム(1280 x 720p 50Hzビデオ信号)が数十ミリ秒遅れて到着する場合があることを意味します。もっと:
- 平均フレームレートが維持されます
- 最大ビデオフレーム遅延は、ネットワーク使用率に依存します
- LAN上のデータが多いほど、最大ビデオフレーム遅延が大きくなります
たとえば、帯域幅の使用量が800 mbpsの場合、PDVは約45〜50ミリ秒です。
私の質問に:
- その値を下げる際の実際的な境界は何ですか?
- これを扱っているインターネットで利用可能な測定レポートについて知っていますか?
私のアプリケーションに微妙なエラー(おそらく過度のロック)があるのか、それとも現在のテクノロジーで数値を改善する方法がないのかを知りたいです。
c# - 非同期 UDP 操作による .NET IOCP ThreadPool オーバーヘッド
リモート SIP エンドポイントと RTP パケットを交換する VoIP メディア サーバーを開発しました。適切にスケーリングする必要があります。最初は、私の C# 実装が置き換えられる C++ バージョンに近づかないのではないかと懸念していましたが、さまざまなプロファイラーを使用して実装を磨き上げたところ、パフォーマンスはかなり近くなりました。
再利用可能なオブジェクトのプールを作成することで、ほとんどのオブジェクト割り当てを排除しました。ReceiveFromAsync と SendToAsync を使用してデータグラムを送受信し、プロデューサー/コンシューマー キューを使用してシステム内で RTP パケットを渡しています。2 x 2.4GHz Xeon プロセッサを搭載したマシンで、約 1000 の同時ストリームを処理できるようになりました。各ストリームは毎秒 50 パケットを送受信します。しかし、反復的なプロファイル/微調整/プロファイルにはまってしまいました - そして、どこかでもっと効率的であると確信しています!
処理をトリガーするイベントは、SocketAsyncEventArgs で呼び出される Completed デリゲートです。次に、処理パイプラインを介して RTP パケットを送信します。
残りのフラストレーションは、IOCP スレッドプールにかなりのオーバーヘッドがあるように見えることです。プロファイラーは、インクルーシブ サンプル時間の 72% のみが「私のコード」にあることを示しています。それ以前の時間は、スレッドプールのオーバーヘッドのようです (以下のスタック フレーム)。
だから、私の質問は次のとおりです。
- 私の理解に何か欠けていますか?
- このオーバーヘッドを削減することは可能ですか?
- 非同期ソケット関数で使用されるスレッドプールを置き換えて、オーバーヘッドの少ないカスタムの軽量スレッドプールを使用することは可能ですか?
windows - I/O 完了ポートを実行するときに、OVERLAPPED 構造体に hEvent を設定する必要がありますか?
シリアル ポート通信に Windows で I/O 完了ポートを使用しています (シリアル ポートを大量に使用する可能性があります)。IOCP を作成し、I/O スレッドをスピンアップし、CreateFile()
ハンドルを IOCP に関連付けます (CreateFile()
で呼び出されましたFILE_FLAG_OVERLAPPED
)。それはすべてうまくいっています。完全に非同期にするために、に設定されているものを除いて、COMMTIMEOUTS
すべてを 0に設定しました。ReadIntervalTimeout
MAXDWORD
私の I/O スレッドで、それがGetQueuedCompletionStatus()
無期限にブロックされることに気付きました。INFINITE
タイムアウトを使用しています。そのためReadFile()
、ハンドルを IOCP に関連付けた直後に呼び出しを行いました。これによりGetQueuedCompletionStatus()
、なんらかの理由で 0 バイトが転送されてすぐに解放されますが、エラーはありません (true を返し、GetLastError() は 0 を報告します)。何もすることがない場合は、明らかにブロックしたいと思います。ReadFile()
GetQueuedCompletionStatus() の後に別のスレッドを配置すると、プール内の別のスレッドがそれを取得し、0 バイトが転送され、エラーは発生しません。
私が見てフォローした例では、IOCP を使用しているときに構造体に をhEvent
設定している人はいません。OVERLAPPED
それは必要ですか?私は IOCP スレッドをブロックしたくありませんCreateEvent(...) | 1
。
必要でない場合、何が問題を引き起こしている可能性がありますか? GetQueuedCompletionStatus()
データがシリアル ポートに到着するまでブロックする必要があります。
そこに良いIOCPシリアルポートの例はありますか? 完全なシリアル ポート + IOCP の例は見つかりませんでした。それらのほとんどはソケット用です。理論的には、シリアルポート、ファイル、ソケットなどで機能するはずです。
c - I/O 完了ポートからのハンドルの削除、および IOCP に関するその他の質問
このCreateIoCompletionPort
関数を使用すると、新しい I/O 完了ポートを作成し、既存の I/O 完了ポートにファイル ハンドルを登録できます。
recv
次に、ソケットに対する や構造をReadFile
持つファイルに対するなど、任意の関数を使用OVERLAPPED
して非同期操作を開始できます。
関数呼び出しがOVERLAPPED
構造体で呼び出されたにもかかわらず同期的に返されたかどうかを確認する必要があり、この場合は直接処理します。それ以外の場合は、ERROR_IO_PENDING
が返さGetQueuedCompletionStatus
れたときに、操作が完了したときに通知される機能を使用できます。
発生する質問は次のとおりです。
I/O 完了ポートからハンドルを削除するにはどうすればよいですか? たとえば、ソケットを IOCP に追加する場合、閉じているソケットを削除するにはどうすればよいですか? 同じ完了キーで別のソケットを再登録する必要がありますか?
また、呼び出しが常に I/O 完了ポートを通過し、同期的に返されないようにする方法はありますか?
そして最後に、たとえば
recv
非同期ではなくsend
同期にすることは可能ですか? たとえば、単純なエコー サービスが実装されている場合:コードの複雑さを軽減するために、recv
新しいデータを非同期で待機し、応答を同期的に待機することはできますか?send
私の場合、recv
最初のリクエストが処理される前に、とにかく二度目はしません。非同期
ReadFile
が要求されたが、それが完了する前にWriteFile
、同じファイルへの を処理する必要がある場合はどうなりますか。ReadFile
エラーメッセージが表示されてキャンセルされ、書き込みが完了したらすぐに読み取りプロセスを再開する必要がありますか?ReadFile
または、書き込む前に手動でキャンセルする必要がありますか? この問題は、通信デバイスと組み合わせて発生します。そのため、書き込みと読み取りが同時に発生しても問題は発生しません。
c++ - C++のスケーラブルなサーバーフレームワーク
何万ものクライアントを同時に処理することを目的としたサーバーアプリケーションをC++で作成しようとしています。WindowsとLinuxで実行する必要があります。私はフレームワークとライブラリを探していて、Boost Asioに出くわしました。これは、非常に成熟していて広く使用されている代替手段のようです。主に何百万ものテンプレートが原因で、ストランド/スレッドプールに頭を巻くのに苦労しています。私のバックグラウンドは主にCであるため、Boostが一般的にいっぱいになっているように見えるテンプレートの混乱にはあまり慣れていません。ストランドやバインドなどを使用してスレッド化/同期化の側面を処理するBoostAsioの周りに比較的薄いラッパーを開発する人を見つけようとしましたが、私の予算内でそれを実行できる人をまだ見つけることができませんでした(2または300米ドル)。
Boost Asio(たとえば、WindowsのIOCPやLinuxのepollなど)と同様に拡張可能な他のライブラリ、またはより小さなフリーランスの仕事を探している熟練したBoost開発者を見つけることができるソースをお勧めしますか?
助けてくれてありがとう。
敬具、
フィリップ・ベネフォール
windows - Node.js は Windows で本番環境に対応していますか?
新しい 0.5.1 ブランチには、Node.js の公式の Windows 実行可能ファイルがあります。Node.js の Linux バージョンは、v8、libev、libeio などの確立されたライブラリを使用します。
libev と libeio は *NIX プラットフォーム用です。Node.js の Windows ポートは本番環境で使用する準備ができていますか?それとも開発専用ですか?