Redis IO 多路复用机制
- 基于linux select/epoll
- select:最大支持1024个文件描述符,在描述符较多情况下性能较差,水平触发
- poll:poll与select基本相同,只是没有文件描述符的限制
- epoll:文件描述符为系统上限,在描述符较多情况下性能较好,同时支持水平与边缘触发
- 内核可同时监听多个监听套接字和 多个已连接套接字
- 一旦内核监听到套接字上有数据返回,立刻交给redis线程处理数据
水平触发
- 只要文件描述符关联的读内核缓冲区非空,有数据可以读取,就一直发出可读信号进行通知
- 当文件描述符关联的内核写缓冲区不满,有空间可以写入,就一直发出可写信号进行通知
- 如果系统中有大量不需要读写的就绪文件描述符,而它们每次都会返回,这样会大大降低处理程序检索自己关心的就绪文件描述符的效率
边缘触发
- 当文件描述符关联的读内核缓冲区由空转化为非空的时候,则发出可读信号进行通知
- 当文件描述符关联的内核写缓冲区由满转化为不满的时候,则发出可写信号进行通知。
- 如果这次没有把数据全部读写完(如读写缓冲区太小),它不会再次通知你
- 直到该文件描述符上出现第二次可读写事件才会通知你
- 这种模式比水平触发效率高,系统不会充斥大量不关心的就绪文件描述符
使用Linux epoll模型的水平触发模式
- 当socket可写时,会不