有关web server的IO模型

http://xueqiangqiang.iteye.com/blog/739655

select 水平触发 文件描述符数据有最大限制 1024

poll  与select基本相同 无最大限制
SIGIO 边缘触发
epoll 水平+边缘 基于事件的就绪通知方式 linux2.6
kqueue 基本于epoll相同 FreeBSD

水平触发 通过一个系统调用select()来监视包括多个文件描述符的数组,方法返回后,该数组中就绪的文件描述符会被内核修改标志位,从而进程可以获得这些文件描述符进行后续的读写操作。

边缘触发 通过实时信号,告诉我们哪些文件描述符是就绪的,并且只说一次,如果没有采取行动,则不再告知。

lighttpd 默认使用水平触发 epoll
nginx 默认使用边缘触发 epoll
apache select


直接IO
O_DIRECT 不通过内核缓冲区
O_SYNC 通过内核缓冲区但是直接读写磁盘 更安全 可将机器故障时数据的丢失减少到最少

sendfile可以直接将磁盘文件的特定部分直接发送到socket描述符,加快静态文件的请求速度





apache的fork模式 由主进程负责accept()来自客户端的连接,一旦接收到连接后,马上fork()一个新的worker进程处理,处理完成后,此进程销毁。
  prefork() 由主进程预先创建一定数量的子进程,每个请求由一个子进程来处理,但每个子进程可处理多个请求。 主进程只负责管理子进程
  所以,apache的多进程模型的开销限制了它的并发连接数,但是相对更安全,一个进程不会影响到另外其它的进程。
  worker多路处理模块 由一个进程中通过多个线程处理多个连接,目的是减少prefork模式太多进程的开销。但其中仍然存在上下文切换的开销。

apache fork prefork woker进程
lighttpd nginx采用单进程模型





多路IO就绪通知的应用
lighttpd和nginx可以支持配置work进程的数量,默认是0,由主进程来进行worker进程的工作,配置后,lighttpd主进程创建两从此worker进程,主进程不进行连接处理。
lighttpd的配置方式
server.event-handler = "linux-sysepoll"

select/poll会扫描所有的文件描述符,而epoll只关注那些活跃连接,不在死连接上浪费时间。

典型应用是图片服务器,采用长连接的方式为用户提供大量图片的快速下载,但是连接在超时关闭前便处于空闲状态,这种情况下,epoll能够很好的工作。

配置更多的worker进程 可以维持更多的活跃连接数,但IO wait会增长,下载速度会减慢。
 
--------------

两天就囫囵吞枣地看了这么点东西 而且还没记住 唉 悲哀啊
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值