高性能服务器、epoll惊群与lighttpd改良

来源:互联网 发布:3306端口怎么对外开放 编辑:程序博客网 时间:2024/05/16 02:15

关于高性能server,《unix网络编程》堪称经典。根据说明,有如下三种相对高效的模型:

模型1(最强)
     一个进程中有预先创建多个线程都阻塞在accept函数(为了免accept惊群,可以在accept前先thread_lock),任何一个监听线程从accept返回得到一个socket就自己处理这个socket.

模型2

     一个进程中有预先创建多个线程都阻塞在select(事件分配)函数,select有返回就调用accept。《unix网络编程》指出select会出现惊群,所以慢了。

模型3
      预先创建多个线程,不过只有一个线程阻塞在accept即只有一个监听线程,这个线程得到socket以后把这个socket给一个空闲线程,用条件变量通知那个空闲进程。由于进程间通信的成本,所以效率比第一种低。

然而模型1并不能充分提高吞吐率,原因是子线程的处理变成了同步IO,一旦多用户把预先分配的多线程全占用了,悲剧了。所以要利用事件分配机制。

关于事件分配机制(学名:反应器)

目前已知的Linux反应器有select、poll、epoll。三者可以部分替换(可以参考lighttpd和Nginx,都对反应器封装了,还可以改运行配置来选择不同机制)

既然同属事件分配,神器epoll也应该有惊群问题,果然找到相关资料(http://bbs.chinaunix.net/thread-1091745-1-1.html)

那怎么办?

1鸵鸟算法:就用模型2(lighttpd就是)

2加锁:模型2,事件分配前加thread__lock

lighttpd看来效率是低了(就算用epoll)

肿么办?

根据http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=4080488&highlight=,可以通过给子线程相同的eventpoll,而且如果升级了内核(具体2.6.多少不清楚,但linux3.0+肯定可以),内核已经避免epoll惊群了。所以说,有以下两条路

1升级新linux内核(又方便又可靠)。

2理论可以事件分配前加lock(lighttpd是多进程哦,锁成本高)

(话说为啥nginx还是比lighttpd高效,它可以用线程池,线程在内存共享方面有极大的优势)













原创粉丝点击