0

オーバーラップしたソケットでWSARecvとWSAGetOverlappedの結果を使用するコードにバグがあります。負荷が高い場合、WSAGetOverlappedはWSASYSCALLFAILURE(「失敗してはならないシステムコールが失敗しました」)で戻り、その後TCPストリームが同期しなくなり、プログラムの上位レベルで混乱が発生します。

これまでのところ、特定のハードウェアまたはドライバーのセットに分離することはできませんでした。誰かがこの問題にもぶつかり、解決策や回避策を見つけましたか?

4

2 に答える 2

1

接続数、保留中の受信者数、アウトサンディング送信数は? perfmon またはタスク マネージャーは、使用されている非ページ プールの量について何と言っていますか? ボックスのメモリ容量は?Vista以降でプログラムを実行すると消えますか? LSP がインストールされていますか?

非ページ プールを使い果たし、不適切に記述されたドライバーがメモリの割り当てに失敗したときに誤動作する可能性があります。この問題は、使用可能な非ページ プールの量が劇的に増加したため、Vista 以降ではあまり発生しません ( http://www.lenholgate.com/blog/2009/03/excellent-article-on-non-pagedを参照)。 -pool.html詳細)。または、「ロックされたページ」の制限に達している可能性があります (OS のメモリ内の固定数のページのみをロックでき、保留中の各 I/O 操作は、バッファー サイズと割り当ての配置に応じて 1 つ以上のページをロックします)。

于 2010-07-16T11:18:33.173 に答える
0

1 ミリ秒スリープし、WSASYSCALLFAILURE が報告されたときに WSAGetOverlapped の結果を再試行することで、この問題を解決したようです。

データがなくても、重複したイベントの発生に関連する別の問題がありました。これも最初に解決する必要がありました。現在、テストは 1 時間以上実行されており、いくつかの WSASYSCALLFAILURE が正しく処理されています。夜間のテストも成功することを願っています。

@Len: ご協力ありがとうございます。

編集: オーバーナイト テストは成功しました。私のバグは、相互に依存する 2 つの問題によって引き起こされました。

問題 1: ConnectionSet::select の WaitForMultipleObjects が空のソケットでデータを送信することがあり、SocketConnection::readSync がデッドロックする。修正:各パケットの最初のバイトでノンブロッキング読み取りを実行します。ソケットが空の場合は ConnectionSet をリセットします

問題 2: WSAGetOverlappedResult がときどき WSASYSCALLFAILURE を返し、TCP ストリームで非同期が発生します。修正:短いスリープ期間の、 WSAGetOverlappedResult を再試行します。

http://equalizer.svn.sourceforge.net/viewvc/equalizer?view=revision&revision=4649

于 2010-07-22T12:29:08.473 に答える