最近我两次遭受了FD_SET
缓冲区溢出的困扰。第一次是因为我们有太多的套接字(1024+)要添加到FD_SET
中。这是一个测试用例,我们已经禁用它,并添加了assert
来检测这种情况。
今天我们运行了一个1000+次的测试用例,遇到了另一个相关问题。每次,测试用例都会以某种方式触发分配套接字,然后在测试用例完成之前释放它。当我们运行1000+次时,这个测试用例将导致FD_SET
缓冲区溢出。
我们已经找到了根本原因:
- 对于每一次通过,分配的套接字ID将增加(+1),它不会在很长一段时间内重复使用套接字ID。操作系统是MAC,我认为这是一个合理的设计,可以避免使用已经释放的套接字而不发生错误。
FD_SET
只使用套接字ID作为索引设置fd_set
位数组,如果套接字ID很大,它将溢出。我认为fd_set
是一个糟糕的设计。
我们认为1000+是一个合理的数字。我们不认为定义宏来设置“fd_set”巨大是合理的,并且会在等待时浪费内存和CPU。
我们不知道如何解决它,所以有什么建议吗?
-------------编辑1----------------
事实证明,在其他地方存在套接字泄漏,违反了析构函数应该释放所有资源的规定。这使得套接字ID增加。
因此,项目#1不正确。操作系统将重复使用套接字ID。
但无论如何,讨论是有帮助的,FD_SET
是糟糕的设计,我们应该使用poll()
。
lsof
命令。你可能会在输出中发现许多打开的套接字。 - rob mayofflsof -g PID
在调试过的进程上不起作用,有什么原因吗? - ZijingWu