基本概念
Nginx 的民主化数学模型Nginx 的事件处置数学模型
request:Nginx 中 http 允诺。基本的 HTTP Web Server 工作模式:1.转交允诺:逐行读取允诺行和允诺头,判断段有允诺体后,读取允诺体2.处理允诺3.返回响应:依照处置结果,生成相应的 HTTP 允诺(响应行、响应头、响应体)Nginx 也是这个套路,整体流程一致。常见问题剖析
Nginx vs. Apache
nginx:IO 多路复用,epoll(freebsd 上是 kqueue )高效能高并发占用系统天然资源少apache:阻塞 + 多民主化/多线程更稳定,bug 少模块更多样参考:http://www.oschina.net/translate/nginx-vs-apachehttps://www.zhihu.com/question/19571087场景:处置数个允诺时,可以采用:IO 多路复用 或者 阻塞 IO +多线程1.IO 多路服用:两个线程,跟踪数个 socket 状况,哪个就绪,就读写哪个;2.阻塞 IO + 多线程:每两个允诺,新建两个服务线程思索:IO 多路复用 和 多线程 的适用场景?IO 多路复用:单个相连的允诺处置速度没有优势,适合 IO 密集型 场景,事件驱动大并发量:只使用两个线程,处置大量的并发允诺,降低语句环境转换耗损,也不需要考虑并发问题,相对可以处置更多的允诺;耗用更少的系统天然资源(不需要线程调度开销)适用于长相连的情况(多线程模式长相连容易造成线程过多,造成频繁调度)阻塞IO + 多线程:实现单纯,可以不依赖系统调用,适合 CPU 密集型 场景每个线程,都需要时间和空间;线程数目增长时,线程调度开销指数增长Nginx 最大相连数基础背景:Nginx 是多民主化数学模型,Worker 民主化用于处置允诺;单个民主化的相连数(文件描述符 fd),有上限(nofile):ulimit -nNginx 上实用性单个 worker 民主化的最大连接数:worker_connections 上限为 nofileNginx 上实用性 worker 民主化的数目:worker_processes因此,Nginx 的最大相连数:Nginx 的最大相连数:Worker 民主化数目 x 单个 Worker 民主化的最大相连数上面是 Nginx 作为通用伺服器时,最大的相连数Nginx 作为逆向全权伺服器时,能够服务的最大相连数:(Worker 民主化数目 x 单个 Worker 民主化的最大相连数)/ 2。Nginx 逆向全权时,会建立 Client 的相连和后端 Web Server 的相连,占用 2 个相连思索:1.每打开两个 socket 占用两个 fd2.为何,两个民主化能够打开的 fd 数目有限制?附 录
HTTP 允诺和响应
HTTP 允诺:允诺行:method、uri、http version允诺头允诺体HTTP 响应:响应行:http version、status code响应头响应体IO 数学模型
场景:处置数个允诺时,可以采用:IO 多路复用 或者 阻塞 IO +多线程1.IO 多路服用:两个线程,跟踪数个 socket 状况,哪个就绪,就读写哪个;2.阻塞 IO + 多线程:每两个允诺,新建两个服务线程思索:IO 多路复用 和 多线程 的适用场景?IO 多路复用:单个相连的允诺处置速度没有优势1.大并发量:只使用两个线程,处置大量的并发允诺,降低语句环境转换耗损,也不需要考虑并发问题,相对可以处置更多的允诺;2.耗用更少的系统天然资源(不需要线程调度开销)3.适用于长相连的情况(多线程模式长相连容易造成线程过多,造成频繁调度)阻塞IO + 多线程:实现单纯,可以不依赖系统调用。1.每个线程,都需要时间和空间;2.线程数目增长时,线程调度开销指数增长select/poll 和 epoll 比较详细内容,参考:select poll epoll三者之间的比较select/poll 系统调用:// select 系统调用intselect(intmaxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval *timeout);// poll 系统调用int poll(struct pollfd fds[], nfds_t nfds, int timeout);select:
查询 fd_set 中,是否有就绪的 fd,可以设定两个超时时间,当有 fd(File descripter)就绪或超时返回。fd_set 是两个位集合,大小是在编译内核时的常量,默认大小为 1024。特点:相连数限制,fd_set 可表示的 fd 数目太小了;线性扫描:判断 fd 是否就绪,需要遍历一边 fd_set;数据复制:用户空间和内核空间,复制相连就绪状况信息。poll:
解决了相连数限制:poll 中将 select 中的 fd_set 替换成了两个 pollfd 数组,解决 fd 数目过小的问题。数据复制:用户空间和内核空间,复制相连就绪状况信息。epoll,event 事件驱动:
事件机制:避免线性扫描,为每个 fd,注册两个监听事件,fd 变更为就绪时,将 fd 添加到就绪链表。fd 数目:无限制(OS 级别的限制,单个民主化能打开多少个 fd)。select,poll,epoll:
I/O 多路复用的机制。I/O 多路复用就透过一种机制,可以监视数个描述符,一旦某个描述符就绪(通常是读就绪或者写就绪),能够通知程序进行相应的读写操作方式;监视数个文件描述符。但 select,poll,epoll 本质上都是同步 I/O:用户民主化负责管理读写(从内核空间拷贝到用户空间),读写操作过程中,用户民主化是阻塞的;异步 IO,无需用户民主化负责管理读写,异步 IO,会负责管理从内核空间拷贝到用户空间。Nginx 的并发处置能力
关于 Nginx 的并发处置能力:并发相连数,通常优化后,峰值能保持在 1~3w 左右。(内存和 CPU 核心理念数相同,会有进一步优化空间)END
官方站点:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
刘遄老师QQ:5604922
Linux技术交流群:193666693
(新群,火热加群中……)
想要学习Linux系统的读者可以点击按钮来了解书籍《Linux就该那么学》,与此同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!