【发布时间】: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/ 这样的真实网站或其他网站按照这种方式来实现其前端服务器,他们可能会如何在高性能服务器中处理这个问题。
【问题讨论】:
标签: c linux multithreading server