使用尽可能多的CPU内核编写一个超级UDP服务器

Writing a super UDP server using as most CPU cores as possible

本文关键字:一个 服务器 UDP 尽可能 CPU 内核      更新时间:2023-10-16

我发现我正在编写的代码有严重的限制。

我想做的是让我的代码在一个smp xeon机器上工作,有24个硬件线程,尽可能高效。

对于这样的任务,我使用commoncpp包装器围绕本机posix线程和套接字加上libev库来检测套接字文件描述符上的读取事件。我想要获得的目标是在UDP套接字连接上没有数据丢失,每个连接应该占用大约600mbit/秒的数据。

我发现建立两个以上的连接会导致数据丢失。

我还发现这五个线程(每个连接一个)在cpu内核上没有很好地平衡/分布…我想说的是,只有两个核心正在工作,而其余的22个是闲置的。

当然(我不能隐藏它)我是一个虚拟的smp开发人员,在尝试建立"硬件线程"时确实需要一些帮助。

我将很高兴了解是否有某种posix能力/特性来强制硬件线程或一些如何指导(像我这样的傻瓜:)),解释如何使用cpu内核用于专用需求。

正如你可能已经理解的,我希望每个连接有一个专用的cpu核心。

谢谢大家!

我可以推荐易于实现的方法,它应该提供相当好的性能。使用增加。Asio与Boost.Thread。提振。Asio提供异步网络,并且可以在多线程环境中使用,而不需要额外的努力(驯服多线程的好例子)。查看这些链接:

  • 异步UDP回声服务器:应该给你一个想法如何使用UDP异步
  • 使用io_service-per- cpu设计的HTTP服务器或使用单个io_service和调用io_service::run():的线程池的HTTP服务器应该让您了解如何在多线程环境中使用Asio。很难说哪种方法更好,我更喜欢"io_service和线程池"。

亚洲第一次能吓到人。但是你会上瘾的。

有一次我听说Asio内部调度器性能不是最优的。对此我不能发表评论。到目前为止,在许多性能要求苛刻的项目中使用了它,我对它的性能很满意。

要实现这种高速网络,您可能需要深入研究硬件和操作系统设置。

检查网卡是否支持多个输入队列,是否可以使用MSI而不是常规中断。看看是否可以为每个CPU核心设置一个输入队列。看看是否有一些选项可以将传入的数据包分配到每个队列。

检查操作系统输入缓冲区大小。你可能需要使它们更大,以避免丢失UDP。