博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
高性能服务器、epoll惊群与lighttpd改良
阅读量:4129 次
发布时间:2019-05-25

本文共 961 字,大约阅读时间需要 3 分钟。

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

转载地址:http://fbzvi.baihongyu.com/

你可能感兴趣的文章
Android中启动其他Activity并返回结果
查看>>
2009年33所高校被暂停或被限制招生
查看>>
GlassFish 部署及应用入门
查看>>
iWatch报错: Authorization request cancled
查看>>
iWatch报错: Authorizationsession time out
查看>>
如何运行从网上下载的iWatch项目详细步骤.
查看>>
X-code7 beta error: warning: Is a directory
查看>>
Error: An App ID with identifier "*****" is not avaliable. Please enter a different string.
查看>>
X-code beta 开发iWatch项目,运行没有错误,但是某些操作一点就崩,而且找不错误的原因场景一
查看>>
Xcode 报错: Extra argument in call
查看>>
iTunes Connect 上传APP报错: Communication error. please use diagnostic mode to check connectivity.
查看>>
#import <Cocoa/Cocoa.h> 报错 Lexical or Preprocessor Issue 'Cocoa/Cocoa.h' file not found
查看>>
`MQTTClient (~> 0.2.6)` required by `Podfile`
查看>>
X-Code 报错 ld: library not found for -lAFNetworking
查看>>
Bitcode
查看>>
If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
查看>>
3.5 YOLO9000: Better,Faster,Stronger(YOLO9000:更好,更快,更强)
查看>>
iOS菜鸟学习--如何避免两个按钮同时响应
查看>>
How to access the keys in dictionary in object-c
查看>>
iOS菜鸟学习—— NSSortDescriptor的使用
查看>>