头文件|阿里面试题 | Nginx 所使用的 epoll 模型是什么?( 二 )


其缺点为:

  • 每次调用 select , 都需要把 fd 集合从用户态拷贝到内核态 , 这个开销在 fd 很多时会很大
  • 同时每次调用 select 都需要在内核遍历传递进来的所有 fd , 这个开销在 fd 很多时也很大
  • select 支持的文件描述符数量只有 1024 , 非常小
如果系统支持的文件描述符数量不够 , 在 Linux 上一般就会表现为:
Too many open files (24)此时就需要通过类似:ulimit -n 2048 的方式来临时提升 。
poll (1997)
对应的头文件和函数原型为:
头文件|阿里面试题 | Nginx 所使用的 epoll 模型是什么?文章插图
poll 和 select 原理一样 , 不过相比较 select 而言 , poll 可以支持大于 1024 个文件描述符 。
epoll (2002)
对应的头文件和函数原型为:
头文件|阿里面试题 | Nginx 所使用的 epoll 模型是什么?文章插图
相比较 select 和 poll , epoll 的最大特点是:
  • epoll 现在是线程安全的 , 而 select 和 poll 不是 。
  • epoll 内部使用了 mmap 共享了用户和内核的部分空间 , 避免了数据的来回拷贝 。
  • epoll 基于事件驱动 , epoll_ctl 注册事件并注册 callback 回调函数 , epoll_wait 只返回发生的事件避免了像 select 和 poll 对事件的整个轮寻操作 。
什么是回调?一个简单的例子:
  • 四六级考试成绩快要出来的那段时间 , 小张每隔一段时间就去尝试查一下成绩 , 这个被称为轮训 。
  • 小张并不在意疯狂刷新页面的事情 , 等到四六级成绩出来之后他的手机会自动收到考试院推送的一个小时:「叮 , 你的六级没过」 , 这样就是回调 。
另一个方便理解的对比如下:
  • 对于 select / poll 模型来说 , 可以理解为让酒店代理订票 , 然后每隔几个小时就问一下买到没有 , 酒店在第二天订到了票 , 交钱给酒店拿到票 , 这样会需要额外的打电话时间和精力 。
  • 对于 epoll 来说则是委托酒店帮忙订票 , 但是并不反复去问 , 酒店在第二天买到了票 , 酒店打电话通知来领票 , 交钱给酒店拿到票 。
epoll 和 Nginx回到文章开头 , 最后我们可以简单总结一下为什么有了 epoll 的 Nginx 会有很高的运行效率 , 其原因在于它使用了异步 , 非阻塞 , IO 多路复用 。 但是我们是不是就应该吹爆 Nginx , 表示「Nginx 完爆 Apache」呢?
其实不是 , 相比较 Nginx 而言 , Apache 作为一个非常老牌的网页服务器 , 其有丰富的模块组件支持 , 稳定性强 , BUG 少 , 动态内容处理强 , 而 Nginx 的优势主要则在于占用资源少 , 负载均衡 , 高并发处理强 , 静态内容处理高效 , 所有只有掌握了自己的具体业务场景 , 才可以分情况地讨论这两个服务器之间的区别 。
对于 Nginx 而言 , 其实还有许多高频面试题 , 例如:
  • Nginx 常用命令有哪些?
需要熟悉:nginx -t, nginx -s stop 之类
  • Nginx 返回 502 错误的可能原因?
这个得分情况分类讨论 , 一般可能是后端服务器挂了 , 也有可能是 Proxy Buffer 不够
  • 正向代理和反向代理之间的区别是什么?
【头文件|阿里面试题 | Nginx 所使用的 epoll 模型是什么?】正向代理:代理端代理的是客户端反向代理:代理端代理的是服务端