nginx 工作模型

问题: 对nginx 而言, 一个工作进程,只创建一个工作线程,但可以打开多个文件。

用ps -ef -L 可以查看, -L 可显示LWP(light weight process) 和 NLWP(number os light weigh process) 列

难道对方用查询方式看结果?还是采用通知?
下面是查询的结果, 略加整理。原来linux2.6 内核已经支持一种高效的并发访问。
————————————————————————————
Nginx采用的是单线程的方式
————————————————————————————
如果在linux下,最好的模型自然是EPool(effectiveepoll?)
2块1000M网卡,10K客户端,每个客户端的带宽是 2000/10000=200K,这是理论值,勉强可行。
————————————————————————————
纯粹线程模型的缺陷!
————————————————————————————
考虑 10K个客户端,需要10K个线程。
考虑到每个进程3G的用户空间,那么每个线程的空间是3000M/10K=300K,
只能说非常勉强可以运行(每个线程的cruntime大约需要2-3K空间)。
但是大量的线程调度会极大的减缓系统效率。
再考虑一下多个进程的模型,每个进程创建多个线程。
其实与纯粹的线程模型差异不大,不过是每个线程的用户空间不受太大限制。
大量的线程调度带来的巨大性能损耗会使得整个系统效率及其低下。
当然,这种模型也不是一无是处,对于客户端数目不多的情况,比如ftp服务器,这种模型是非常合适的

————————————————————————————
epoll模 型。
————————————————————————————
了解select模型的人都知道,select每个句柄只能支持64个socket
Poll模型则是一种事件触发的模型,没有64个socket的限制

由于Select和Poll在连接数增加时,性能急剧下降。这有两方面的原因:
首先操作系统面对每次的select/poll操作,都需要重新建立一个当前线程的关心事件列表,
并把线程挂在这个复杂的等待队列上,这是相当耗时的。
其次,应用软件在select/poll返回后也需要对传入的句柄列表做一次扫描来dispatch,这也是很耗时的。
这两件事都是和并发数相关,而I/O事件的密度也和并发数相关,导致CPU占用率和并发数近似成O(n^2)的关系。因为以上的原因,
*nix的hacker们开发了epoll,kqueue,/dev/poll这3套利器来帮助大家,
其中epoll是linux的方案,kqueue是freebsd的方案,/dev/poll是最古老的Solaris的方案
简单的说,这些api做了两件事:
1.避免了每次调用select/poll时kernel分析参数建立事件等待结构的开销,
kernel维护一个长期的事件关注列表,应用程序通过句柄修改这个列表和捕获I/O事件。
2.避免了select/poll返回后,应用程序扫描整个句柄表的开销,Kernel直接返回具体的事件列表给应用程序。


要使用epoll模型,首先必须有Linux2.6的内核
epoll是对Poll模型的一个改造,让一个Poll句柄可以同时支持多个Socket句柄,
好处是将大量Poll句柄的事件探测机制放到内核中处理,大大减少了将数据从内核态拷贝到用户态的次数,从而提高效率。
阅读Linux的源码可以看到,epoll的内部使用的是一个Hashmap,Hashmap中存放Poll对象,
所以从根本上来说,epoll模型是一种更好的Poll模型(我一直理解为EffectivePoll)。

在接触具体api之前,先了解一下边缘触发(edge trigger)和水平触发(level trigger)的概念。
边缘触发是指每当状态变化时发生一个io事件,水平触发是只要满足条件就发生一个io事件。
    举个读socket的例子,假定经过长时间的沉默后,现在来了100个字节,
    这时无论边缘触发和条件触发都会产生一个read readynotification通知应用程序可读。
    应用程序读了50个字节,然后重新调用api等待io事件。
    这时条件触发的api会因为还有50个字节可读从而立即返回用户一个read readynotification。
    而边缘触发的api会因为可读这个状态没有发生变化而陷入长期等待。
因此在使用边缘触发的api时,要注意每次都要读到socket返回EWOULDBLOCK为止,否则这个socket就算废了。
而使用水平触发的api时,如果应用程序不需要写就不要关注 socket可写的事件,
否则就会无限次的立即返回一个write readynotification。
大家常用的select就是属于水平触发这一类。epoll用到的所有函数都是在头文件sys/epoll.h中声明的
nginx 采用了linux 的epoll 模型来提高并发性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值