(1) I/O 模型的选择,
epoll就一定好吗? 那是肯定的。
epoll最有用的就是ET模式,适合于那种有大量连接,但是有数据的连接比较少的情况,
如果你有10000个连接,但是很不幸,这10000个连接全部都有数据,你还是得遍历一把进行处理,( 这里对ET模式下怎么处理数据就不讨论了)。
这个和select, poll有什么区别。
epoll还有比select, poll先进得地方, 就在于将fd得列表维护在内核中, 而select, poll是调用一次,传递一次, 这点epoll领先是没得说得。
最主要还是epoll系统调用的实现方式采用事件方式,比poll, select的轮询方式强的多
(2) 使用非堵塞
做为网络服务器, 堵塞I/O一般情况下不予考虑,视服务器模型
(3) 减少I/O操作和无谓的系统调用
比如利用writev一次性写入多个数据, 减少write调用的次数.
或者使用零拷贝的sendfile,tee等
(4) tcp是双工的
这点不要忽略掉, 数据转发程序就在于数据的转发速度, 这里我采用读和写分开线程的处理方式
(5) 进程还是线程
这个无关紧要,一个粒度和数据访问, 稳定性的问题。减少之间的相互影响,尽量没有关联, 比如减少对相关互斥数据的访问等等。
(6) 尽量在设计上做到不需要锁
比如使用环形缓存, 环形消息队列等