問題タブ [io-completion-ports]

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.

0 投票する
6 に答える
14429 参照

winapi - Win32 オーバーラップ I/O - 完了ルーチンまたは WaitForMultipleObjects?

どちらのアプローチがより高速で、なぜですか?

Win32 サーバーを作成しているときに、完了ポートとオーバーラップ I/O について多くのことを読みましたが、どの API のセットがサーバーで最良の結果をもたらすかを示唆するものは何も読んでいませんでした。

完了ルーチンを使用する必要がありますか、それとも WaitForMultipleObjects API を使用する必要がありますか? その理由は?

0 投票する
2 に答える
1549 参照

windows - IO完了ポートパケットはいつ送信され、いつ送信されませんか?

私は現在、IO完了ポートを使用する名前付きパイプに基づくIPCメカニズムに取り組んでいます。

残念ながら、msdnのドキュメントに問題があります。これは、ReadFile / WriteFileを呼び出すと、完了パケットが生成されるかどうかがはっきりしないためです。

ERROR_IO_PENDINGでFALSEが返される場合は明らかですが、ERROR_MORE_DATAが返される場合の明らかに可能な場合はどうでしょうか。この場合、完了パケットはありますか?さらに、他のエラーが返された場合はどうなりますか?どの場合、完了ハンドラーではなく、結果を処理してリソースを直接解放する必要がありますか?

もう1つのケースは、ReadFile / WriteFileが成功した場合ですが、これも可能です。ありがたいことに、MSDNはこれについてかなり明確です

さらに、WriteFile関数は、非同期ハンドルを使用している場合でも、GetLastError値がERROR_SUCCESSの場合にTRUEを返すことがあります(ERROR_IO_PENDINGの場合はFALSEを返すこともあります)。...この例では、完了ポートルーチンがそのようなリソースのすべての解放操作に対して単独で責任を負うことを許可することをお勧めします。

この推奨事項はすべての場合に正しいのでしょうか。また、完了ポートに割り当てられたハンドルに対するReadFile / WriteFile操作の結果は、パケットがポートに送信されるため、実際には完全に無視できますか(実際には無視する必要があります)。

0 投票する
1 に答える
16991 参照

asynchronous - epoll、poll、threadpool の違いは何ですか?

とスレッドプールの違いを誰か説明できepollますか?poll

  • 長所/短所は何ですか?
  • フレームワークに関する提案はありますか?
  • 簡単な/基本的なチュートリアルの提案はありますか?
  • とは Linux 固有epollpollようです... Windows 用の同等の代替手段はありますか?
0 投票する
2 に答える
155 参照

c++ - ソケットベースのモデルの私のグラフィック表現と解釈

http://img600.imageshack.us/img600/3567/graphicrepresentation.png

私は正しい方法で推論していますか?もしそうなら、上のスキームのように、 I / O Completion Portsがどのように機能するかを誰かに教えてもらえますか? MMORPG 用のサーバーのような高性能サーバーの作成について学ぶ前に、それがどのように機能するのかを確認したいと思います。

0 投票する
3 に答える
2899 参照

c# - HttpWebRequestおよびI/O完了ポート

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

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

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

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

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

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

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

0 投票する
2 に答える
2732 参照

c++ - boost::asio / io 完了ポートを介して断続的にデータが配信されない

問題

同じマシン上の 2 つのプロセスが TCP/IP を使用して通信するプロジェクトにboost::asioを使用しています。一方は他方が読み取るデータを生成しますが、断続的に接続を介してデータが送信されないという問題が発生しています。async tcp echo server exampleに基づいて、これを以下の非常に単純な例に要約しました。

プロセス (以下のソース コード) は問題なく開始され、送信者から受信者に高速でデータが配信されます。その後、突然、約 5 秒間、データがまったく配信されなくなります。その後、次の不可解な一時停止まで、データが再び配信されます。この 5 秒間、プロセスは 0% の CPU を消費し、他のプロセスは特に何もしていないようです。一時停止は常に同じ長さ (5 秒) です。

私はこれらの失速を取り除く方法とそれらの原因を理解しようとしています.

実行全体の CPU 使用率:

1 回の実行中の CPU 使用率

実行の途中で CPU 使用率が 3 回低下していることに注意してください。「実行」とは、サーバー プロセスとクライアント プロセスの 1 回の呼び出しです。これらの急落の間、データは配信されませんでした。ディップの数とそのタイミングは実行ごとに異なります。まったくディップがない場合もあれば、ディップが多い場合もあります。

読み取りバッファーのサイズを変更することで、これらのストールの「可能性」に影響を与えることができます。たとえば、読み取りバッファーを送信チャンク サイズの倍数にすると、この問題はほとんど解消されますが、完全ではないように見えます。

ソースとテストの説明

Boost 1.43 と Boost 1.45 を使用して、Visual Studio 2005 で以下のコードをコンパイルしました。Windows Vista 64 ビット (クアッドコア) と Windows 7 64 ビット (クアッドコアとデュアルコアの両方) でテストしました。

サーバーは接続を受け入れ、データの読み取りと破棄を行うだけです。読み取りが実行されるたびに、新しい読み取りが発行されます。

クライアントはサーバーに接続し、一連のパケットを送信キューに入れます。この後、一度に 1 つずつパケットを書き込みます。書き込みが完了するたびに、キュー内の次のパケットが書き込まれます。別のスレッドがキューのサイズを監視し、これを毎秒 stdout に出力します。io ストールの間、キューのサイズはまったく同じままです。

scatter io (1 つのシステム コールで複数のパケットを書き込む) を使用しようとしましたが、結果は同じです。を使用して Boost で IO 完了ポートを無効にするBOOST_ASIO_DISABLE_IOCPと、問題は解決したように見えますが、スループットが大幅に低下します。

したがって、私の質問は基本的に次のとおりです。

これらの屋台を取り除くにはどうすればよいですか?

これが起こる原因は何ですか?

更新:上記とは逆に、ディスク アクティビティとの相関関係があるようです。そのため、テストの実行中にディスク上で大きなディレクトリ コピーを開始すると、IO ストールの頻度が高くなる可能性があります。これは、これがWindows IO の優先順位付けであることを示している可能性がありますか? 一時停止は常に同じ長さなので、OS io コードのどこかでタイムアウトのように聞こえます...

0 投票する
2 に答える
1678 参照

windows - ソケット サーバーの効率的なオーバーラップ I/O

これら 2 つの異なるモデルのどちらがより効率的でしょうか (スラッシング、プロセッサ キャッシュの使用率、全体的な設計、すべてなどを考慮してください)?

  1. 1 IOCP と X スレッドのスピンアップ (X はコンピューターに搭載されているプロセッサの数)。これは、私の「サーバー」がすべてのリクエストに対して 1 つの IOCP (キュー) しか持たず、それらを処理/処理するための X スレッドがあることを意味します。この設計の効率性について論じている多くの記事を読みました。このモデルでは、IOCP にも関連付けられるリスナーが 1 つあります。パケット/リクエストの同期を維持する方法を理解できたとしましょう。

  2. X IOCP (X はコンピューターに搭載されているプロセッサの数) であり、各 IOCP には 1 つのスレッドがあります。これは、各プロセッサに独自のキューと、それらを処理/処理するための 1 つのスレッドがあることを意味します。このモデルでは、着信接続を処理し、SOCKET を適切な IOCP (作成された X の 1 つ) に割り当てる別のリスナー (IOCP を使用しない) を用意します。負荷分散を理解できたとしましょう。

2 つの設計 (銀行) の非常に単純化された類推を使用すると、次のようになります。

  1. トランザクションを処理するための複数のレジ係を含む 1 つの行。各人が同じ列に並び、各レジ係が次に空いている人を順番に受け取ります。

  2. 各レジ係には独自の列があり、人々はそれらの列の1つに「配置」されます

これら 2 つの設計のうち、どちらがより効率的か。各モデルでは、オーバーラップされた I/O 構造は (「新規」ではなく) MEM_COMMIT で VirtualAlloc を使用するため、スワップ ファイルは問題になりません (ページングなし)。MEM_COMMIT で VirtualAlloc を使用して説明した方法に基づいて、メモリは予約され、ページアウトされません。これにより、SOCKET は中間層を経由せずに受信データをバッファに直接書き込むことができます。したがって、スラッシングが要因になるべきではないと思いますが、間違っている可能性があります。

#2 の方が効率的だという人もいましたが、このモデルは聞いたことがありません。コメントありがとうございます!

0 投票する
2 に答える
4925 参照

winsock - GetQueuedCompletionStatus は、リモート ソケットの閉鎖時に ERROR_NETNAME_DELETED を返します

I/O-Completion Port を使用して、小さなサーバー クライアントのようなものを書いています。

サーバーとクライアントは、完了ポートを介して AcceptEx 経由で正常に接続されます。クライアントが接続した後、クライアント ソケットは完了ポートに関連付けられ、そのソケットで WSARecv へのオーバーラップ呼び出しが呼び出されます。

クライアント テスト プログラムを閉じるまでは、すべて問題なく動作します。 GetQueuedCompletionStatus()リターンFALSEGetLastErrorリターン

ERROR_NETNAME_DELETED

、これは私には理にかなっています (MSDN の説明を読んだ後)。

しかし、私の問題は、呼び出しが適切な戻り値を返すGetQueuedCompletionStatusため、ソケットの閉鎖による失敗を示すパケットを返すと思ったことです。WSARecvこれは当てはまらないので、どのクライアントのソケットがエラーを引き起こしたのかわからず、必要な方法で動作できません (構造の解放、この特定の接続のクリーンアップなど)...

これを解決する方法に関する提案、またはヒントはありますか?

ありがとう:)

編集: http://codepad.org/WeYINa ​​sO <- 責任のあるコード... "エラー" は、while ループの最初の関数で発生します (呼び出しGetCompletionStatus()は、GetQueuedCompletionStatus() のラッパーであり、正常に動作します)他のケース) [ここはくだらない&乱雑に見えるので、そこに投稿しました]

0 投票する
1 に答える
1062 参照

winapi - 私のループは間違っていますか?ReadFile() と I/O 完了ポートを誤用していませんか?

名前付きパイプを使用してサーバー/クライアントを実装したい (IPC 用)。非同期 (オーバーラップ) 接続と I/O 完了ポートを使用しています (よく検索したところ、それが最も効率的な方法のようです)。 .

まず、コードは次のとおりです。

サーバー: http://pastebin.com/XxeXdunC

クライアント: http://pastebin.com/fbCH2By8

問題はサーバーにあります(クライアントを改善できますが、サーバーが機能するときにそれを行います)。

私はそのような I/O 完了ポートを使用します。基本的に、ReadFile() を呼び出すスレッドを実行します。TRUE が返された場合、すべてのデータを取得します。FALSE が返され、エラーが ERROR_IO_PENDING の場合は、GetQueuedCompletionStatus() で待機します。

奇妙なのは、すべてのデータを読み取ったとしても、最後の ReadFile() 呼び出しが失敗し、エラーが ERROR_IO_PENDING であることです。

ReadFile() を呼び出すスレッドは、サーバー コードの 64 行目から始まります。

クライアントは 24 バイト (文字列 "salut, c'est le client !") を送信し、ReadFile() バッファーの長さは 5 バイトです (サーバーが Readfile() バッファーよりも大きいデータを処理する方法を確認するため)。

出力は次のとおりです。

私が理解していないのは、すべてのデータを読み取っても、ReadFile() がまだ保留中の操作を返すことです (最後の「msg」出力の後の「ReadFile2: ERROR_IO_PENDING」エラー メッセージです)。

私のループは間違っていますか?ReadFile() / GetQueuedCompletionStatus() を誤用していませんか?

ありがとうございました

0 投票する
6 に答える
1434 参照

c# - ループのないスレッドを終了する

ループを含まないワーカースレッドを停止する方法が必要です。アプリケーションはスレッドを開始し、スレッドはFileSystemWatcherオブジェクトとTimerオブジェクトを作成します。これらのそれぞれにコールバック関数があります。これまでに行ったことは、揮発性のboolメンバーをスレッドクラスに追加し、タイマーを使用してこの値を確認することです。この値が設定されたら、スレッドを終了する方法に悩まされています。

したがって、スレッドが停止するように指示されたときにタイマー/ FileWatcherを破棄できますが、実際にスレッドを終了/停止するにはどうすればよいですか?