Redis 中的 epoll 模型
1.多路复用
redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量
存在的问题 Redis 是跑在单线程中的, 所有的操作都是按照顺序线性执行的, 但是由于读写操作等待用户输入或输出都是阻塞的, 所以 I/O 操作在一般情况下往往不能直接返回, 这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务
redis的io模型主要是基于epoll实现的, 不过它也提供了 select和kqueue的实现, 默认采用epoll
2. epoll机制
有100万个客户端同时与一个服务器进程保持着TCP连接。而每一时刻, 通常只有几百上千个TCP连接是活跃的(事实上大部分场景都是这种情况)。如何实现这样的高并发?
在select/poll时代, 服务器进程每次都把这100万个连接告诉操作系统(从用户态复制 句柄数据结构 到内核态), 让操作系统内核去查询这些套接字上是否有事件发生, 轮询完后, 再将句柄数据复制到用户态, 让服务器应用程序轮询处理已发生的网络事件, 这一过程资源消耗较大, 因此, select/poll一般只能处理几千的并发连接
存在的缺点:
1.每次调用select/poll, 都需要把fd集合从用户态拷贝到内核态, 这个开销在fd很多时会很大
2.同时每次调用select/poll都需要在内核遍历传递进来的所有fd, 这个开销在fd很多时也很大
3.针对select支持的文件描述符数量太小了, 默认是1024
4.select返回的是含有整个句柄的数组, 应用程序需要遍历整