在对我编写的某些服务器代码进行压力测试时,我注意到即使我在描述符句柄上调用 close()(并验证结果是否有错误),但描述符并未释放,最终导致 accept() 返回一个错误“打开的文件太多”。
现在我明白这是因为 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 位机器上运行。
有什么想法吗?