![自定义应用程序的 10Gbit 以太网性能确实很差](https://linux22.com/image/485355/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%2010Gbit%20%E4%BB%A5%E5%A4%AA%E7%BD%91%E6%80%A7%E8%83%BD%E7%A1%AE%E5%AE%9E%E5%BE%88%E5%B7%AE.png)
我最近在几台机器上安装了几个 10Gbit 以太网卡,这些机器连接到一个运行分布式文件系统 (Lustre) 的大约 80 个商用节点的 LAN。10Gbit 卡在文件操作方面表现良好,运行正常。
但是,我用 C 编写了一个自定义客户端应用程序,它可以异步向网络中的多个节点发送大量数据。运行客户端应用程序的机器有 10GB 以太网卡,所有目标节点都有 1GB 以太网卡 - 因此我应该能够获得理论上的最大发送传输速率 10 gbits。
如果我在配备 1Gbit 卡的机器上运行客户端应用程序,它很容易在长时间内使卡超负荷。但奇怪的是,如果我在配备 10Gbit 卡的机器上运行相同的应用程序,它的性能会非常糟糕(大约每秒 20-30 mbits)。
该程序是用 C 语言编写的,使用普通的 TCP 套接字。10Gbit 是否需要一些特殊设置?因为它在 1Gbit 卡上获得最大性能,但在 10Gbit 卡上性能却很糟糕,这很奇怪。同样,问题不在于 10Gbit 卡本身,因为分布式文件系统 (Lustre) 在 10Gbit 卡上获得了良好的性能。
有什么想法或建议吗?
答案1
我注意到 10gb 和 1gb 局域网段之间存在一个问题,即默认 MTU 不同。10gb 以太网使用默认 MTU 9000,而 1gb 以太网使用默认 MTU 1500。您可以将 10g 上的 MTU 更改为较低的数字,也可以设置路由器来为您处理巨型数据包的分解。
这让我有些头疼,因为如果没有配置这两个东西中的任何一个,就会出现大量的数据包碎片。
答案2
您编写的应用程序很可能与 Lustre 等标准化应用程序的 I/O 优化不相符。
您的代码中的性能瓶颈可能不会出现在具有 1Gbps 卡的机器和操作系统上,但是当卡的吞吐能力增加到 10Gbps 时,如果其他所有参数保持不变(硬件和操作系统),您的代码限制就会变得突出。
这是从维基百科引用的Lustre 实施部分。
在 Linux 客户端上安装典型的 Lustre 时,Lustre 文件系统驱动程序模块会加载到内核中,文件系统的安装方式与其他本地或网络文件系统一样。客户端应用程序看到的是一个统一的文件系统,尽管它可能由数十到数千个单独的服务器和 MDT/OST 文件系统组成。
在某些大规模并行处理器 (MPP) 安装中,计算处理器可以通过将其 I/O 请求重定向到配置为 Lustre 客户端的专用 I/O 节点来访问 Lustre 文件系统。这种方法已在 LLNL Blue Gene 安装中使用
您正在使用这个部件吗?
另一种方法是使用 liblustre 库为用户空间应用程序提供直接文件系统访问。
Liblustre 允许数据直接在应用程序空间和 Lustre OSS 之间移动,而无需通过内核进行中间数据复制,从而提供从计算处理器到 Lustre 文件系统的低延迟、高带宽访问。
答案3
MTU 对于保持接口的一致性非常重要。
确保已打开硬件 TCP 卸载(如果可以工作)。并且所有网卡上的固件都是最新的,因为某些网卡在出厂时 TOE 就已损坏。我会测试 TOE 和 TSO 等的开启和关闭情况,看看是否有任何不同。
您是否正在使用 Broadcomm 10G 以太网,因为我们发现了它们存在实际问题。
您是否使用 lnet 测试器测试过您的网络?
您有多少个 OSS 以及您通过文件系统获得了什么样的吞吐量?