当进行一些服务器代码,我写了一个压力测试,我发现,即使我的描述符句柄调用close()(和验证错误的结果)的描述符没有被释放,最终导致accept()方法返回一个错误"打开文件太多".
现在我明白这是因为ulimit,我不明白为什么如果我在每个同步接受/读/发送周期后调用close(),我会遇到它?
我通过运行带有lsof的监视来验证描述符实际上是在那里:
ctsvr 9733 mike 1017u sock 0,7 0t0 3323579 can't identify protocol ctsvr 9733 mike 1018u sock 0,7 0t0 3323581 can't identify protocol ...
当然,大约有1000个左右.此外,使用netstat检查我可以看到没有挂起的TCP状态(没有WAIT或STOPPED或任何东西).
如果我只是从客户端执行单个connect/send/recv,我会注意到套接字确实保留在lsof中; 所以这甚至不是负载问题.
服务器在Ubuntu Linux 64位计算机上运行.
有什么想法吗?