Epoll 连接无响应或响应时间过长
来源:互联网 发布:c语言!=是什么意思 编辑:程序博客网 时间:2024/04/27 19:06
Epoll有两种模式,LT模式 与 ET模式。默认情况下是LT模式,由于ET模式在高并发,高流量的情况下,处理效率会高于ET模式,所以也就采用了ET模式。
服务器一直运行良好,跑几千机器人也没有什么问题。但突然之间发现,机器人在反复掉线上线的测试后,会出现一种情况:服务器端会再也收不到客户端的连接事件,或者这个连接事件响应会非常慢,而已连接成功的fd读写数据是没有任何问题的。
主要的原因还是因为ET模块的代码编写要求比较高,LT模式就像汽车的自动档,你只要挂上档,就能把速度搞上去。而ET模式有点像汽车的手动档,任何时候变速都是需要你自己操作的。LT是条件触发,只要满足条件,是一直触发,直到你把它处理完成。而ET有点类型是事件触发,发生了某个事件的时候,他只触发一次,如果这一次你没能在逻辑里写处理好,那就不会再触发了,那这个事件的处理就被丢失。
所以我的问题应该还是没能把ET模式用好,最后的解决办法大概如下,还原回了默认的方式:
bind(listenfd,(sockaddr *)&serveraddr, sizeof(serveraddr));listen(listenfd, LISTENQ);ev.data.fd=listenfd;//ev.events=EPOLLIN|EPOLLET;ev.events=EPOLLIN;//监听的FD 用默认的EPOLLLT模式
if(events[i].data.fd==listenfd) //如果新监测到一个SOCKET用户连接到了绑定的SOCKET端口,建立新的连接。 { connfd = accept(listenfd,(sockaddr *)&clientaddr, &clilen); if(connfd<0){ perror("connfd<0"); return (1); } setnonblocking(connfd); ev.data.fd=connfd; //ev.events=EPOLLIN | EPOLLET; ev.events=EPOLLIN;//这里也用默认的EPOLLLT模式 epoll_ctl(epfd,EPOLL_CTL_ADD,connfd,&ev); }
0 0
- Epoll 连接无响应或响应时间过长
- 连接oracle数据库无响应
- 响应头过长
- C# SQL语句执行时间过长在操作完成之前超时时间已过或服务器未响应问题的解决
- 开发报表-页面响应时间过长-for循环语句注意事项
- 【译】如何精确判断最终用户响应时间过长的原因?
- 【译】怎么精确判断最终用户响应时间过长的原因
- fonts.googleapis.com响应时间过长的解决方法
- 解决网页响应慢,waiting(TTFB)时间过长
- word无响应或反应慢
- 无响应
- socket连接传输对象无响应
- 解决远程连接kafka集群无响应
- mongodb连接数引起响应时间变长
- 关于myeclicpse经常无响应和创建或打开maven项目无响应的解决方法
- 如何知道窗口是否无响应或卡屏呢
- ssh中,项目无响应,或运行一段时间后停止响应的解决办法
- Java heap space造成tomcat响应时间过长,原因在JVM内存分配太小,解决方法
- 队列实现栈和栈实现队列
- linux tcp并发式服务器应用SELECT函数编写实例源代码(转载)
- 数据库怎样把一个表的数据插入到另一个表
- Java实现基数排序
- 开源项目Android-Universal-Image-Loader 解析
- Epoll 连接无响应或响应时间过长
- 【徐志摩】我等候你
- Objective C运行时(runtime)技术的几个要点总结
- NSInvocation简单总结
- iphone SprintBoard部分私有API总结
- 使用私有api统计ios app运行时间及次数
- 使用私有api实现自己的iphone桌面,并根据app的使用次数对app排序
- Cas 3.5.2 登录成功后,如何返回用户更多信息?
- ios编程时常见问题总结