私が書いたいくつかのサーバー コードでストレス テストを実施しているときに、記述子ハンドルで close() を呼び出している (そしてエラーの結果を検証している) にもかかわらず、記述子が解放されていないことに気付きました。エラー「開いているファイルが多すぎます」。
これは ulimit が原因であることがわかりました。理解できないのは、各同期の受け入れ/読み取り/送信サイクルの後に close() を呼び出すと、なぜそれが発生するのかということです。
lsof でウォッチを実行して、記述子が実際にそこにあることを検証しています。
ctsvr 9733 mike 1017u sock 0,7 0t0 3323579 プロトコルを識別できません ctsvr 9733 mike 1018u sock 0,7 0t0 3323581 プロトコルを識別できません ...
そして確かにそれらの約1000かそこらがあります。さらに、netstat で確認すると、ハングしている TCP 状態がないことがわかります (WAIT や STOPPED などはありません)。
クライアントから単一の接続/送信/受信を実行すると、ソケットが lsof にリストされたままになることに気付きます。したがって、これは負荷の問題でもありません。
サーバーは Ubuntu Linux 64 ビット マシンで実行されています。
何かご意見は?