nginx为什么这么快

发布时间 - 2019-06-20 00:00:00    点击率:

主要原因是Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型。

epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,在开始讨论这个问题之前,先来解释一下为什么需要多路复用IO.

以一个生活中的例子来解释.

假设你在大学中读书,要等待一个朋友来访,而这个朋友只知道你在A号楼,但是不知道你具体住在哪里,于是你们约好了在A号楼门口见面.

如果你使用的阻塞IO模型来处理这个问题,那么你就只能一直守候在A号楼门口等待朋友的到来,在这段时间里你不能做别的事情,不难知道,这种方式的效率是低下的.

现在时代变化了,开始使用多路复用IO模型来处理这个问题.你告诉你的朋友来了A号楼找楼管大妈,让她告诉你该怎么走.这里的楼管大妈扮演的就是多路复用IO的角色.

进一步解释select和epoll模型的差异.

select版大妈做的是如下的事情:比如同学甲的朋友来了,select版大妈比较笨,她带着朋友挨个房间进行查询谁是同学甲,你等的朋友来了,于是在实际的代码中,select版大妈做的是以下的事情:


int n = select(&readset,NULL,NULL,100);

for (int i = 0; n > 0; ++i)
{
if (FD_ISSET(fdarray[i], &readset))
{
do_something(fdarray[i]);
--n;
}
}


epoll版大妈就比较先进了,她记下了同学甲的信息,比如说他的房间号,那么等同学甲的朋友到来时,只需要告诉该朋友同学甲在哪个房间即可,不用自己亲自带着人满大楼的找人了.于是epoll版大妈做的事情可以用如下的代码表示:

n=epoll_wait(epfd,events,20,500);

for(i=0;in;++i)
{
do_something(events[n]);
}


在epoll中,关键的数据结构epoll_event定义如下:

typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

struct epoll_event {
__uint32_t events;
/* Epoll events */
epoll_data_t data;
/* User data variable */
};

可以看到,epoll_data是一个union结构体,它就是epoll版大妈用于保存同学信息的结构体,它可以保存很多类型的信息:fd,指针,等等.有了这个结构体,epoll大妈可以不用吹灰之力就可以定位到同学甲.

别小看了这些效率的提高,在一个大规模并发的服务器中,轮询IO是最耗时间的操作之一.再回到那个例子中,如果每到来一个朋友楼管大妈都要全楼的查询同学,那么处理的效率必然就低下了,过不久楼底就有不少的人了.

对比最早给出的阻塞IO的处理模型, 可以看到采用了多路复用IO之后, 程序可以自由的进行自己除了IO操作之外的工作, 只有到IO状态发生变化的时候由多路复用IO进行通知, 然后再采取相应的操作, 而不用一直阻塞等待IO状态发生变化了.

从上面的分析也可以看出,epoll比select的提高实际上是一个用空间换时间思想的具体应用。

更多Nginx相关技术文章,请访问Nginx教程栏目进行学习!


# nginx  # 多路  # 复用  # 来了  # 这个问题  # 的是  # 是一个  # 带着  # 你在  # 可以看到  # 人了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明  Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】  如何在万网ECS上快速搭建专属网站?  如何在建站主机中优化服务器配置?  如何为不同团队 ID 动态生成多个非值班状态按钮  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  魔方云NAT建站如何实现端口转发?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Python文件异常处理策略_健壮性说明【指导】  如何选择可靠的免备案建站服务器?  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  在Oracle关闭情况下如何修改spfile的参数  韩国服务器如何优化跨境访问实现高效连接?  网站制作企业,网站的banner和导航栏是指什么?  Laravel如何使用Eloquent进行子查询  如何在阿里云高效完成企业建站全流程?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何处理CORS跨域请求?(配置示例)  谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复  如何在Windows环境下新建FTP站点并设置权限?  为什么php本地部署后css不生效_静态资源加载失败修复技巧【技巧】  如何在香港免费服务器上快速搭建网站?  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  高防网站服务器:DDoS防御与BGP线路的AI智能防护方案  Laravel API资源类怎么用_Laravel API Resource数据转换  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  php结合redis实现高并发下的抢购、秒杀功能的实例  长沙企业网站制作哪家好,长沙水业集团官方网站?  ,在苏州找工作,上哪个网站比较好?  香港服务器租用每月最低只需15元?  中山网站制作网页,中山新生登记系统登记流程?  香港服务器WordPress建站指南:SEO优化与高效部署策略  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel如何处理和验证JSON类型的数据库字段  JavaScript常见的五种数组去重的方式  IOS倒计时设置UIButton标题title的抖动问题  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  Laravel怎么判断请求类型_Laravel Request isMethod用法  高防服务器如何保障网站安全无虞?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  Laravel Debugbar怎么安装_Laravel调试工具栏配置指南  Laravel如何使用Telescope进行调试?(安装和使用教程)  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Laravel Session怎么存储_Laravel Session驱动配置详解  Linux网络带宽限制_tc配置实践解析【教程】  如何用虚拟主机快速搭建网站?详细步骤解析