​ 在频繁操作MySQL数据库或者其他数据库的时候,尤其是并发量高时,服务端可能会返回一个超时错误或者被拒绝连接请求的错误,这些原因很可能是服务端的套接字(socket)连接到达了瓶颈,或者处理数据时耗时太多,队列未处理的请求过多。多路复用的核心就是利用系统内核的功能,避免启用大量的线程来处理套接字的请求。用一个多路复用模型去处理高并发量的命令和请求。

​ Epoll模型采用基于事件的就绪通知方式,如图10-2和图10-3所示。在select/poll模式中,只有进程调用一定的方法后,内核才对所有监视的文件描述符进行扫描(遍历)。Epoll事先通过epoll_ctl()来注册一个文件描述符,一旦某个文件描述符就绪,内核就会采用类似callback的回调机制,迅速激活这个文件描述符,当进程调用epoll_wait时便得到通知,而且Epoll模型利用内存映射(mmap)技术,省掉了这些文件描述符在系统调用时复制的开销(内核空间和用户空间的复制)。

image-20220425104546115

image-20220425104618735

image-20220425104628589

Redis 6引入的多线程机制就是对该瓶颈的优化,其本质是将主线程的IO读写任务拆分出来给一组独立的线程去执行,使得多个套接字的读写可以并行化,这样就可以利用CPU的多核提高处理能力。