Nginx 服务器,正常运行过程中:
外部的操作
(信号)外部的操作
的不同,通过信号
管理 Worker核心数
,充分利用 CPU 资源,同时,避免进程数量过多,避免进程竞争 CPU 资源,增加上下文切换的损耗。思考:
HTTP 连接建立和请求处理过程:
Nginx 高性能、高并发:
多进程
+ 异步非阻塞
方式(IO 多路复用
epoll)request:Nginx 中 http 请求。
基本的 HTTP Web Server 工作模式:
请求行
和请求头
,判断段有请求体后,读取请求体
响应行
、响应头
、响应体
)Nginx 也是这个套路,整体流程一致。
nginx的模块根据其功能基本上可以分为以下几种类型:
nginx vs. apache:
网络 IO 模型:
场景:
处理多个请求时,可以采用:
IO 多路复用
或者阻塞 IO
+多线程
一个
线程
,跟踪多个 socket 状态,哪个就绪
,就读写哪个;思考:IO 多路复用
和 多线程
的适用场景?
IO 多路复用
:单个连接的请求处理速度没有优势,适合 IO 密集型 场景,事件驱动线程调度开销
)长连接
的情况(多线程模式长连接
容易造成线程过多
,造成频繁调度
)阻塞IO
+ 多线程
:实现简单,可以不依赖系统调用,适合 CPU 密集型 场景基础背景:
nofile
):ulimit -n
worker_connections
上限为 nofile
worker_processes
因此,Nginx 的最大连接数:
Worker 进程数量
x 单个 Worker 进程的最大连接数
反向代理
服务器时,能够服务的最大连接数:(Worker 进程数量
x 单个 Worker 进程的最大连接数
)/ 2。Client 的连接
和后端 Web Server 的连接
,占用 2 个连接思考:
一个进程
能够打开的 fd 数量有限制?method
、uri
、http version
http version
、status code
场景:
处理多个请求时,可以采用:
IO 多路复用
或者阻塞 IO
+多线程
一个
线程
,跟踪多个 socket 状态,哪个就绪
,就读写哪个;思考:IO 多路复用
和 多线程
的适用场景?
IO 多路复用
:单个连接的请求处理速度没有优势线程调度开销
)长连接
的情况(多线程模式长连接
容易造成线程过多
,造成频繁调度
)阻塞IO
+ 多线程
:实现简单,可以不依赖系统调用。详细内容,参考:
select/poll 系统调用:
// select 系统调用int select(int maxfdp,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
,可以设定一个超时时间
,当有 fd (File descripter) 就绪或超时返回;位集合
,大小是在编译内核
时的常量,默认大小为 1024poll:
数组
fd 数量过小
的问题epoll: event 事件驱动
注册
一个监听事件
就绪
时,将 fd 添加到就绪链表
select,poll,epoll:
I/O多路复用
的机制;I/O多路复用
就通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作。多个文件描述符
同步I/O
:用户进程
负责读写
(从内核空间
拷贝到用户空间
),读写过程中,用户进程是阻塞的;异步 IO
,无需用户进程负责读写,异步IO,会负责从内核空间
拷贝到用户空间
;关于 Nginx 的并发处理能力:
关注微信公众号:松花皮蛋的黑板报,获取更多精彩!
公众号介绍:分享在京东工作的技术感悟,还有JAVA技术和业内最佳实践,大部分都是务实的、能看懂的、可复现的
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。