【问题标题】:Kernel bypass for UDP and TCP on Linux- what does it involve?Linux 上 UDP 和 TCP 的内核绕过 - 它涉及什么?
【发布时间】:2013-03-20 02:47:53
【问题描述】:

每http://www.solacesystems.com/blog/kernel-bypass-revving-up-linux-networking:

[...]一个名为 OpenOnload 的网络驱动程序,它使用“内核绕过”技术在用户空间中一起运行应用程序和网络驱动程序,并且绕过内核。这允许连接的应用程序端每秒处理更多消息,延迟更低且更一致。

[...]

如果您是一名开发人员或架构师,多年来一直在与上下文切换作斗争,内核绕过可能感觉像是在作弊,但幸运的是它完全符合规则。

这样的内核绕过需要哪些函数?

【问题讨论】:

  • 除了为连接到您的 rcomputer 的 NIC 编写自己的网络驱动程序之外别无他法。
  • @JosephH 你是说内核绕过是“驱动绕过”吗?你会在某个时候需要一个“司机”吗?还是我们必须在内核之外重新编写驱动程序?
  • 你认为如何不经过内核直接操作网卡?
  • 这和我的 SO 问题不一样吗?
  • 我不明白为什么这个问题被关闭了。这个问题很明确并且很有价值,并且提到的情况并不是“非常狭窄”。

标签: c linux performance kernel openonload


【解决方案1】:

您是否希望发送和接收原始 IP 数据包?

基本上,您需要在 ip-packet 中填写标头和数据。 这里有一些关于如何发送原始以太网数据包的示例: :http://austinmarton.wordpress.com/2011/09/14/sending-raw-ethernet-packets-from-a-specific-interface-in-c-on-linux/

要自己处理 TCP/IP,我认为您可能需要在自定义内核中禁用 TCP 驱动程序,然后编写您自己的读取原始 ip 的用户空间服务器。

虽然效率可能不高...

【讨论】:

    【解决方案2】:

    TCP offload engine 将“正常工作”,无需特殊的应用程序编程。它并没有绕过整个内核,只是将一些 TCP/IP 堆栈从内核移动到网卡,因此驱动程序级别稍高。内核 API 相同。

    大多数现代千兆接口都支持 TCP 卸载引擎。

    或者,如果您的意思是“在 SolarFlare 网络适配器的嵌入式处理器/FPGA '应用程序加载引擎'上运行代码”,那么......这是特定于卡的。您基本上是在为嵌入式系统编写代码,因此您需要说明您使用的是哪种卡。

    【讨论】:

    【解决方案3】:

    好的,所以这个问题在不知道内核如何处理网络堆栈的情况下无法直接回答。

    一般来说,网络堆栈由很多层组成,最低的一层是实际的硬件,通常这种硬件由驱动程序支持(每个网络接口一个),网卡通常提供非常简单的接口,想想接收和发送原始数据。

    在这个物理连接之上,能够接收和发送数据的是很多协议,它们也是分层的,靠近bottem的是ip协议,它基本上允许你指定信息的接收者,而在顶部,您会发现支持稳定连接的 TCP。

    因此,为了回答您的问题,您首先要弄清楚您需要替换网络堆栈的哪一部分,以及您需要做什么。根据我对您的问题的理解,您似乎希望保留原始网络堆栈,然后有时使用您自己的,在这种情况下,您真的应该只实现策略模式,并可以说明哪些数据包应该由网络堆栈的哪个顶层处理。

    取决于网络堆栈在 linux 中的实现方式,您可能无法实现这一点,而无需更改内核。在微内核架构中,网络堆栈的每个部分都在其自己的服务中实现,这将是微不足道的,因为您只需将网络堆栈的较低部分通过管道传输到您的策略模式,并将此管道输入到所需的网络顶层。

    【讨论】:

    • 那么你的意思是,这种情况下的内核绕过意味着在用户空间中编写你自己的网络堆栈?我会进入操作系统源代码,在将数据包发送到内核网络堆栈的那一行,我会将它们直接发送到用户空间中的“应用程序”?
    • 这样做会破坏整个网络连接,因此只有您的应用程序具有“互联网访问权限”,我宁愿建议仅将您需要的包定向到您的应用程序。而且您应该能够重用当前的大部分网络堆栈,具体取决于您要实现的目标,但如果您只是对原始包感兴趣,只需设置一个字符设备驱动程序,它直接读取 nics 缓冲区,而不会干扰,或者挂接到网卡驱动程序并用您自己的替换它的服务调用,这会转储信息,然后将调用转发到网卡本身。
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2012-06-26
    • 2020-05-27
    相关资源
    最近更新 更多