使用尽可能多的CPU内核编写一个超级UDP服务器
Writing a super UDP server using as most CPU cores as possible
我发现我正在编写的代码有严重的限制。
我想做的是让我的代码在一个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。
- C++启动另一个程序(客户端-服务器)的程序
- 我正在编写一个简单的客户端套接字应用程序,但在连接后服务器收到一个空缓冲区
- 仅使用一个端口一起设计两个服务器
- 是否可以寻址另一个网络中的服务器/客户端套接字?(C++)
- Boost.Asio 异步服务器.限制为一个连接
- 你好世界示例,一个在 C 语言中使用 SSL 的猫鼬网络服务器
- 我发送了一个 websocket 包,但服务器只回答 400
- Windows,C++:一个服务器套接字上有两个连接
- C++:一个客户端与多个服务器通信
- 耗尽流程com服务器 - 每个呼叫过程一个服务器进程
- 提升ASIO TCP,为什么我不能在服务器端只有一个数据套接字可以打开和关闭
- 多线程服务器在一个线程中处理多个客户端
- 设计一个C++的 asio 流媒体服务器
- C++ System V 信号量:多个服务器进程,一个客户端进程
- 为什么我在尝试编译我的第一个 CORBA 服务器(使用 ACE/TAO ORB 实现)时遇到链接器错误
- Zeromq如何制作一个允许它不等待客户端请求的C ++服务器程序
- 服务器多线程无法保存最后一个套接字描述符
- 如何用一个简单的winsocktcp服务器接受多个客户端
- 使用nodejs/http解析器创建一个web服务器
- 我如何设置一个不断侦听循环与接收udp套接字,而不使它成为一个服务器