Linux下多线程服务器的执行模式
Posted
技术标签:
【中文标题】Linux下多线程服务器的执行模式【英文标题】:Execution Patter of Multi-Threaded Server on Linux 【发布时间】:2021-06-21 23:21:34 【问题描述】:我想知道在高性能服务器的请求-响应周期中实现 TCP 的服务器多线程的执行模式应该是什么(例如使用 Packet MMAP 或一些在 Linux 上具有单个或没有系统调用的数十个数据包其他方式)。
设计 1) 为简单起见,在服务器程序开始时在 main 中启动两个线程。一个线程直接从网络接口(如 wlan0/eth0)获取数据包。并且在一个周期内读取一次数据包数(在 Linux 中使用带有 poll() 的 while 循环)。使用条件变量信号调用唤醒另一个线程。唤醒后,其他线程(发送方)处理并发送数据包作为 tcp 响应。
设计2)在主程序开始时启动接收线程。数据包接收线程使用 while 循环和 poll() 从接口读取数据包。当接收到的数据包数时,创建发送者线程并将一个周期内接收到的数据包数作为参数传递给发送者。发送者线程处理数据包并作为 tcp 响应进行响应。
(我认为,设计 2 将更容易实现,但这种方法是否存在任何设计问题或可能的性能问题,这是问题所在)。由于需要在接收数据包之前分配创建缓冲区以从接收线程传递给发送线程。所以我知道要分配的缓冲区的大小。同样在这个执行模式中,我正在创建新线程(它将在处理数据包和响应 tcp 响应后返回并结束执行)。我想知道这种方法的性能问题是什么,因为每次我从接口获取一批数据包时都会创建新线程。
在第一种方法中,我不会创建两个以上的线程(或者可以轻松跟踪有限数量的线程和线程以进行日志记录和调试,因为我会知道最初创建了多少线程)在第二种方法中,我不知道如何许多线程正在闲置并同时执行。
我需要任何建议,如果像 youtube/ 这样的真实网站或其他网站按照这种方式来实现其前端服务器,他们可能会如何在高性能服务器中处理这个问题。
【问题讨论】:
【参考方案1】:首先,访问“真实”网站时,神奇之处在于拥有负载平衡器和一大堆工作节点来承担负载,并且您可以轻松超越单个系统的边界。例如,查看以下用于大规模提供网页服务的 AWS 参考架构AWS Cloud Architecture for serving web whitepaper。
话虽如此,将这一层降低,看看其他知名产品如何解决这个问题总是很有趣。例如 nginx 有一个很好的 infographic 可用,并且匹配 blogpost 描述他们的架构和线程。
【讨论】:
以上是关于Linux下多线程服务器的执行模式的主要内容,如果未能解决你的问题,请参考以下文章