Written by
Zongquan
on
on
连接无响应 - epoll
Epoll有两种模式,LT模式 与 ET模式。 默认情况下是LT模式,由于ET模式在高并发,高流量的情况下,处理效率会高于ET模式,所以项目中采用了ET模式。
服务器一直运行良好,跑几千机器人也没有什么问题。但突然之间发现,机器人在反复掉线上线的测试后,会出现一种情况:服务器端会再也收不到客户端的连接事件,或者这个连接事件响应会非常慢,而已连接成功的fd读写数据是没有任何问题的。
ET模式事件触发条件:
对于读取操作:
- (1) 当buffer由不可读状态变为可读的时候,即由空变为不空的时候。
- (2) 当有新数据到达时,即buffer中的待读内容变多的时候。
- (3) 当buffer中有数据可读(即buffer不空)且用户对相应fd进行epoll_mod IN事件时。
对于写操作:
- (1) 当buffer由不可写变为可写的时候,即由满状态变为不满状态的时候。
- (2) 当有旧数据被发送走时,即buffer中待写的内容变少得时候。
- (3) 当buffer中有可写空间(即buffer不满)且用户对相应fd进行epoll_mod OUT事件时。
LT模式事件触发条件:
- 包含ET模式的所有条件
对于读操作:
- 当buffer中有数据,且数据被读出一部分后buffer还不空的时候,即buffer中的内容减少的时候,LT模式返回读就绪。
对于写操作:
- 当buffer不满,又写了一部分数据后扔然不满的的时候,即由于写操作的速度大于发送速度造成buffer中的内容增多的时候,LT模式会返回就绪。
分析发现,将ET模式改为LT模式,该问题就解决了。
分析和Review了代码,觉得不应该有问题,但是为啥ET模式下,就收不到新的连接事件了呢,有点奇怪,从两种模式的差异看,好像应该和连接无关,如果是连接数到达了上限,应该是两种模式下都有一样的问题才对,但是LT模式确实没有问题。
由于上线时间比较着急,目前测试下来,LT模式下性能也能满足,暂时就改为LT模式。 以后还需要学习更多的网络问题排查方式来更进一步定位这个问题才行。
留下了一个遗憾,没有定位到最终问题,不知道大家有没有好的方式来定位这个问题?