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

关于高性能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高效,它可以用线程池,线程在内存共享方面有极大的优势)













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值