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
)
この件について何か考えてくれてありがとう!