求解:EPOLL高并发下不再响应新事件
我用的就是网上比较典型的EPOLL模型,我把accept单独放在了另一个线程中。使用EPOLLET模式,监视了EPOLLIN和EPOLLLDUP事件。EPOLLLDUP用于监视客户端的CLOSE事件,来者皆close之,另外在EPOLLIN事件处理中,用了一个recv,判断是否返回0.或-1,是就close掉。除此之外没有任何业务处理逻辑。
在客户端,我用500个线程去连接EPOLL,连接上以后什么都不做,sleep(3000)后断开,断开后再继续连接,反复这个过程。以作压力测试。
问题是现在启动客户端以后跑上个十几秒,在服务器端就再也无法响应包括客户端close在内的任何事件,而accept线程还在不断的接收,导致fd迅速攀升。
通过netstat可以看到大量的CLOSE_WAIT。
不知何故,是我的压力测试程序写的太天真了吗?我确定关了iptables。