求解:EPOLL高并发下不再响应新事件

CQC618172 2010-11-15 12:32:08
我用的就是网上比较典型的EPOLL模型,我把accept单独放在了另一个线程中。使用EPOLLET模式,监视了EPOLLIN和EPOLLLDUP事件。EPOLLLDUP用于监视客户端的CLOSE事件,来者皆close之,另外在EPOLLIN事件处理中,用了一个recv,判断是否返回0.或-1,是就close掉。除此之外没有任何业务处理逻辑。

在客户端,我用500个线程去连接EPOLL,连接上以后什么都不做,sleep(3000)后断开,断开后再继续连接,反复这个过程。以作压力测试。

问题是现在启动客户端以后跑上个十几秒,在服务器端就再也无法响应包括客户端close在内的任何事件,而accept线程还在不断的接收,导致fd迅速攀升。

通过netstat可以看到大量的CLOSE_WAIT。

不知何故,是我的压力测试程序写的太天真了吗?我确定关了iptables。
...全文
122 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
风声边界 2010-11-15
  • 打赏
  • 举报
回复
有epoll的ET模式接收数据的的处理方式吗(一般是传输大数据时如何处理较好)?
方便的话,给个例子
shengmei208@163.com
风声边界 2010-11-15
  • 打赏
  • 举报
回复
CLOSE_WAIT是说的收到一个FIN,但是不能及时返回一个ACK,此时socket处于CLOSE_WAIT状态
CQC618172 2010-11-15
  • 打赏
  • 举报
回复
自己解决了,是EPOLL_WAIT监视线程中的一个锁没有解开导致线程阻塞,感谢楼上朋友。。。
风声边界 2010-11-15
  • 打赏
  • 举报
回复
试试改close为shutdown如何

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧