2019.3.3更新
经过测试,使用epoll的ET模式对比LT模式并没有太大的性能提升,但是LT模式的可靠性远远优于ET模式,如果使用ET模式需要增加大量代码以提升可靠性。所以在设计系统的时候应对两种模式加以权衡,需要极致性能则需要解决ET不够可靠的弊端,或者直接选用LT模式牺牲部分性能。
0. 问题起因
使用epoll模型后,虽然提高了服务器的并发性,但是在测试时发现一个很严重的问题,当服务器负载很高时,部分数据会丢弃掉,问题最严重的时候10万条测试数据可以达到百分之5的丢失概率,这对于服务器来说已经违背的初衷,虽然并发性能提高了,但是服务器的可靠性得不到保证。
1. 问题分析
通过Epoll部分的代码,查阅了Epoll的相关资料和特性,做出如下推测。
首先从Epoll的两种事件模型说起。
Edge Triggered(ET)
Level Triggered(LT)
当使用LT模式时,事件发生时内核会通知程序处理该事件(例如可读事件),如果用户没有做出响应,内核会继续通知。这样是造成了LT模式较慢的原因,但是LT模式可以减少编程时错误的可能性。
为了提高服务器的并发性,使用ET模式,当事件发生时内核同样会通知程序处理该事件,但此时内核默认你已经处理的该事件,不管你是不是真的处理了,都不会再通知你。
在此次高性能服务器设计中,三个线程分别执行读操作,测试客户端持续向服务器发送数据,维持服务器高负载。数据到来时内核可能通知程