ubuntu 10.04で実行されているC ++でコード化されたサーバーがあり、現在本番環境にあり、奇妙なバグが見られます。
環境 :
サーバーに接続する各クライアントには、1 つのソケットと 2 つのスレッドがあります。
- ソケットへの書き込み用の 1 つのスレッド、
- ソケットから読み取るための 1 つのスレッド。
ソケットは10 秒で構成さ::setsockoptれます。SO_RCVTIMEO
::sendソケットのそれぞれにフラグMSG_NOSIGNALが設定されています(それぞれ::recvfromにもフラグが設定されていますが、影響はないようです)
バグ :
次のシナリオがめったに発生しない可能性があるといういくつかの証拠があります (ただし、100% 確実ではありません)。
::recvfromが呼び出され、データが存在するかタイムアウトに達するまでブロックされます::sendが呼び出され、ソケットへの書き込みがエラーをトリガーし、EPIPE(Broken Pipe) エラーを返します- バグ :まだブロックされており、オプション
::recvfromを無視して戻ってこないSO_RCVTIMEO
上記のシナリオはあなたにとって意味がありますか?
指標 :
バグはほぼ毎週発生します。1 週間の間に、およそ :
- 20K ソケット使用
- 30M
::recvfromコール - 60M
::sendコール
のタイムアウト機能を使用する必要があり::selectますか? (タイムアウトの実装がそれとは異なると仮定してSO_RCVTIMEO)
この件について何か考えてくれてありがとう!