三种I/O模型对比
上面3种target的I/O处理流程实际上就是对应常见的3种I/O模型。
- 1个连接对应1个网络线程+n个I/O线程:这种模型首先需要1个线程来处理所有的connect请求,然后连接建立的时候才能去创建该连接的网络线程及I/O线程(在IET的实现中,用户态的ietd担任这个角色)。这种模型的好处是每个连接有自己的网络线程,各个连接之间不干扰,并且该连接上的I/O处理有专门的I/O线程负责,网络线程只用做好网络收发及协议解析相关的操作,各司其职,并且可以利用多cpu的资源,充分发挥cpu的利用率;缺点就是当连接比较多的时候很耗资源;
- epoll+多个I/O线程:epoll是现在比较流行的处理模型,一个epoll的处理能力大概10万qps,如果在epoll线程里只是处理网络包及协议的解析之类的,那么epoll的能力足够了,不过如果在里面有涉及到I/O的操作,就有可能处理时间比较长导致其他连接上的请求无法响应,因此将I/O处理单独出来比较好。epoll的有个缺点就是只能利用单个cpu的资源,如果需要更高的处理能力,单epoll的方式会成为瓶颈,一个比较好的扩展方式是多epoll+多个I/O线程,将不同连接分配到不同的epoll线程去处理(比如采用hash的方式分配),然后I/O仍然由另外的I/O线程来处理;
- 1个连接对应2个线程(receive和send):这个是比较过时的做法,好处就是比较简单,明显的缺点就是连接多了会导致线程资源占用过多给系统带来瓶颈。