作者回复: 对的,而且65535只是限制了nginx与一个上游服务端口之间的连接数。
作者回复: 这么理解没问题,上游服务器的总连接数限制了作为反向代理的nginx的并发上限。
作者回复: 当需要监控某个事件时,用户进程要把它加到树中;当某个事件发生时,系统把它加入到链表中。
作者回复: 1、红黑树用于快速操作,例如增删改查
2、链表用于epoll_wait系统调用,快速返回活跃事件
作者回复: 1、变成活跃,通常是因为网卡收到报文,而从报文的端口和IP可以快速关系到socket,再把这个socket直接放到链表即可,不需要遍历全部连接。
2、红黑树的查找效率是O(logN)的复杂度,比队列的O(N)好得多
作者回复: 1、链表中存放的是活跃的事件;
2、网卡收到报文形成事件,放入该链表;
3、二叉树是事件全集,包括不活跃事件。它相当于链表的字典,用于快速查询。
作者回复: 可以这么理解活跃连接:在TCP连接上正在处理HTTP请求。因为一个HTTP请求由一个请求+一个响应组成,相当于一个事务。事务完成后,若连接仍然留存等待下次复用,则是非活跃连接。参见后续第三部分最后一课、第四部分与上游的keepalive、第五部分tcp keepalive连接的课程。
作者回复: 1、epoll只是一组API,不是框架。
2、是的。
作者回复: 1、基于epoll的事件多路复用减少了进程间切换的次数,使得操作系统少做了相对于用户任务来说的无用功。
2、epoll比select等多路复用方式来说,减少了遍历循环及内存拷贝的工作量,因为活跃连接只占总并发连接的很小一部分。
作者回复: 网卡发现报文后,内核可以直接从地址定位到事件
作者回复: select和poll最大的问题是,每次都需要传递全部并发fd,而实际只有少量fd有数据需要处理,所以效率低下。而epoll通过epoll_ctl和epoll_wait分解了这个问题,效率大幅提高。
作者回复: 一个TCP连接是四元组,所以nginx对下游虽然只开放一个端口例如80,IP地址也只有1个,但下游服务器每台可以对该nginx最多建立6万多连接,只要15台下游服务器,就能建立百万并发连接了。
作者回复: 先讲下什么叫不活跃连接,比如:
1、有些TCP连接网速很慢,只有几B/S;
2、有些客户端很慢,它的CPU 100%了;
3、有些业务应用需要用户做输入后,才会在TCP连接上继续发送消息。
我就不穷举了。这些TCP连接,在某个1秒内都没有任何事件,就叫不活跃链接。
反之叫活跃链接
作者回复: 事件太笼筒了。你所指的新事件是指网络事件吗?比如收到ACK,或者收到PSH报文吗?这只会加到rdlist链表中。
作者回复: 监听网络事件 ,包括接收到TCP报文(ACK或者DATA报文)或者触发定时器,可以看下27课。对TCP协议引发的网络事件可以再看下《Web协议详解与抓包实战》第88-96课。
作者回复: 边缘触发。nginx处理是非阻塞的,如果不是有问题的HTTP模块导致阻塞,是不会出现你说的情况的
作者回复: 不对,Nginx只使用ET模式
作者回复: 建议优先阅读wiki上的资料,例如https://zh.wikipedia.org/wiki/Epoll
作者回复: 全部正确!