【问题标题】:Fastest C/C++ technique for sending data across network? [closed]通过网络发送数据的最快 C/C++ 技术? [关闭]
【发布时间】:2012-10-03 19:49:03
【问题描述】:

如果我有两个 Linux 机器,并且我正在编写一个 C/C++ 程序以在一个机器上发送消息并在另一个机器上接收,那么最快的方法是什么?

我不确定我听到的各种套接字/网络技术是否只是底层技术的简单包装,或者它们是否是替代可能性。我只想知道最接近我可以从我的应用程序中实现的“裸机”。

我在想最快的方法是将我的程序编写为驱动程序并将其加载到内核中。但是,我仍然需要知道最快的套接字实现才能与这个想法一起使用。

【问题讨论】:

  • 这里有一些非常明显的选择,例如 TCP。您所指的“各种套接字/网络技术”有哪些?
  • 我想归结为“快”有多快? TCP 不是实时的,但是相邻的 2 个盒子之间的有线 GB 连接非常快。我想如果您需要快速和实时,您可能希望将它们都放在同一个 PCI/PCIe 总线上。我已经在实时工业环境中使用过它,但除非我不得不这样做,否则我不想弄乱它;-0
  • 我猜你会浪费很多时间来尝试过度优化。尝试“裸机”的额外开发和维护量几乎肯定不会产生显着收益,而且绝对比购买更快的机器更划算。
  • 我不认为Nagle算法用于UDP,仅用于TCP。但即使在 TCP 中,您也可以使用 setsockoptTCP_NODELAY 禁用它。
  • 什么是“快”?低延迟还是高吞吐量?您的数据有多大?

标签: c++ c linux sockets kernel


【解决方案1】:

任何现代 PC 都能够保持以太网芯片缓冲区满载,因此“裸机”编程不会带来任何好处。与网络延迟(即光速限制)相比,通过内核增加的延迟非常小,不值得优化。

对于在两个连接的 Linux 机器之间进行高带宽数据移动的“快速”,TCP 是您的朋友,因为它会优化自身以达到最大的网络能力,而无需您自行检测和调整。直接连接的丢包率可以忽略不计,而且延迟通常很低,因此您不必担心窗口大小等问题。

如果您想要“快速”以快速处理小请求,请使用 UDP。

如果您对“快速”有其他定义,那么您需要详细说明。

【讨论】:

    【解决方案2】:

    好吧,除非您想构建一个用于通过以太网进行自定义通信的内核模块,否则 libc 中最快的用户空间 API 是 Berkley Sockets API。是的,这是对内核 TCP/IP 和 UDP/IP 的包装,它是 IP 上的一层,它是 WWAN、LAN 和以太网的一层,它是其他东西上的一层,但除非你需要如此不可思议和精确的性能,我建议留在用户空间中的简单东西,而不是编写你需要使用更低的内核模块。除非我完全错了,否则无法从用户空间访问原始以太网、WWAN 或 LAN,更不用说实际访问硬件了。

    注意:如果您有几年时间重写整个 UNIX 网络堆栈和网卡驱动程序,您可以在以 root 用户身份运行 ioperm() 调用时从用户空间获得 x86 I/O 端口访问权限,但我没有建议重写整个 UNIX 网络堆栈。这差不多是 2 年的工作。此外,来自 3-d 方应用程序的直接硬件访问是等待发生的安全灾难。

    注意:如果您可以不使用任何传统的硬件进行联网,您可以为双端 USB 电缆编写自定义驱动程序并在其上创建自定义网络协议,就像编写 Linux USB 设备一样drivers 可能是最容易编写的驱动程序,因为它有一个大型 API。我真的不知道这里的速度会如何叠加,因为 USB 2.0 比旧的以太网标准更快,但是他们开始有 1 Gbps 以太网,现在有 SUB 3.0,所以这可能更快或更慢,取决于可用的硬件。这更多是关于易用性。

    编辑:为了速度,请永远不要将代码放入内核。请。您在机器中放置的巨大安全漏洞不值得性能的小幅提升。曾经有一段时间,系统调用非常昂贵,您希望最小化并添加到内核是一种选择,但是对于 Intel 的 sysenter/sysexit 和 AMD 的 sysret 等较新的标准,它们足够便宜,不能保证安全漏洞。

    【讨论】:

      【解决方案3】:

      这个问题不完整,因为您没有指定任何要求,只是它必须快。这里有很多方面需要考虑,例如要使用的协议(TCP 用于可靠性,UDP 用于流式传输等),序列化(您计划通过网络发送什么样的数据,您可以使用序列化库,例如Google Protobuf?)等等。

      我的建议是查看各种 RPC 框架,例如 Apache Thrift、Apace Etch 或 ZeroC Ice,并在您决定确实需要使用 BSD 套接字 API 或类似的低级抽象之前对它们进行基准测试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 2013-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多