使用 epoll 处理多个并发请求

Handing multiple simultaneous requests using epoll

我正在尝试学习如何使用 epoll 来创建一个服务器,该服务器接收并执行来自客户端的命令(登录、下载文件等)。到目前为止,我已经让程序简单地向客户端发送它收到的所有数据,但我注意到当我尝试执行我列出的命令时,服务器一次只能处理一个请求。

我正在尝试想出一种可以同时处理许多命令的有效方法。到目前为止,我想到的唯一想法是创建一个单独的线程来处理每个请求,但我不确定这是否是最佳解决方案。处理这个问题的好方法是什么?

如果你的架构是epoll+单线程,那么如果你的命令负载很重,它会出现一些阻塞问题。这就是为什么当某些命令被阻塞时,redis 的性能会下降。

还有其他可能的架构。但在尝试这些之前,请先进行一些性能测试。如果 Redis 可以在单线程内完成数百万次 OPS,你也可以做到。

epoll + command per thread: 正如你所说。但是线程的创建和销毁会在负载上升时增加成本。经常上下文切换也是一个大问题。

epoll + 线程池:示例思路。但没有上述缺点。

epoll based listener + N*(epoll worker):这是一个有趣的结构。 epoll 侦听器将从用户那里获取请求,但它不是直接将作业分配给线程,而是将文件描述符注册到下一个 worker 的 epoll 中。这样,侦听线程被释放,可以更快地接受连接。