我最近在几台机器上安装了几个 10Gbit 以太网卡,这些机器连接到运行分布式文件系统 (Lustre) 的大约 80 个商品节点的 LAN。10Gbit 卡在文件操作上实现了良好的性能,并且运行正常。
但是,我用 C 语言编写了一个自定义客户端应用程序,该应用程序将大块数据异步发送到网络中的多个节点。运行客户端应用程序的机器有一个 10GB 以太网卡,所有目标节点都有一个 1GB 以太网卡 - 所以我应该能够获得 10 gbits 的理论最大发送传输速率。
如果我在具有 1Gbit 卡的机器上运行客户端应用程序,它很容易在持续的时间长度内最大化卡。但奇怪的是,如果我在具有 10Gbit 卡的机器上运行相同的应用程序,它的性能会很糟糕(大约每秒 20-30 mb)。
该程序使用普通 TCP 套接字用 C 语言编写。10Gbit 需要一些特殊设置吗?因为它在 1Gbit 卡上获得最大性能是非常奇怪的,但在 10Gbit 卡上性能却很糟糕。同样,问题不在于 10Gbit 卡本身,因为分布式文件系统 (Lustre) 使用 10Gbit 卡可以获得良好的性能。
有什么想法/建议吗?
我注意到 10gb 和 1gb 局域网段之间存在问题的一件事是默认 MTU 不同。10gb 以太网使用 9000 的默认 MTU,而不是 1gb 以太网的默认值 1500。您可以将 10g 上的 MTU 更改为较小的数字,或者设置您的路由器来处理分解巨型数据包。
这让我有些头疼,因为如果没有配置这两个东西之一,就会有很多数据包碎片。
您编写的应用程序很可能无法与 Lustre 等标准化应用程序的 I/O 优化相提并论。
您的代码中的性能瓶颈可能不会出现在使用 1Gbps 卡的机器和操作系统上,但是当卡的吞吐能力增加到 10Gbps,而所有其他参数(硬件和操作系统)保持不变时,您的代码限制就会变得突出。
这是从维基百科光泽实现部分引用的。
你在用这部分吗?
MTU 对于在接口上保持一致很重要。
确保您已打开硬件 TCP 卸载(如果有效)。并且您所有 nic 上的固件都是最新的,因为某些 nic 上的 TOE 在出厂时非常损坏。我会打开和关闭 TOE 和 TSO 等进行测试,看看它是否有任何区别。
您是否在使用 Broadcomm 10G 以太网,因为我们发现了这些问题。
您是否使用 lnet tester 测试过您的网络?
你有多少 OSS,你通过文件系统获得了什么样的吞吐量?