为什么我的千兆绑定不能提供至少150 MB / s的吞吐量?


17

我直接在两个不同的PCIe适配器上连接了两个PowerEdge 6950分频器(使用直线)。

我在每条线路上都有一个千兆链路(1000 MBit,全双工,双向流量控制)。

现在,我正在尝试使用双方的rr算法将这些接口绑定为bond0(我想为单个IP会话获取2000 MBit)。

当我通过使用dd bs = 1M和netcat在tcp模式下将/ dev / zero传输到/ dev / null来测试吞吐量时,我得到的吞吐量为70 MB / s,而不是预期的150MB / s以上。

当我使用单条线时,如果每条线使用不同的方向,则每条线的速度约为98 MB / s。如果流量进入“相同”方向,则使用单条线路时,线路速度分别为70 MB / s和90 MB / s。

仔细阅读bonding-readme(/usr/src/linux/Documentation/networking/bonding.txt)之后,我发现以下部分很有用:(13.1.1单交换机拓扑的MT Bonding模式选择)

balance-rr:此模式是唯一允许单个TCP / IP连接在多个接口上对流量进行条带化的模式。因此,它是唯一一种允许单个TCP / IP流利用一个接口的吞吐量以上的模式。但是,这样做需要付出一定的代价:条带化通常会导致对等系统接收到乱序的数据包,从而经常通过重新传输段来使TCP / IP的拥塞控制系统进入。

    It is possible to adjust TCP/IP's congestion limits by
    altering the net.ipv4.tcp_reordering sysctl parameter. The
    usual default value is 3, and the maximum useful value is 127.
    For a four interface balance-rr bond, expect that a single
    TCP/IP stream will utilize no more than approximately 2.3
    interface's worth of throughput, even after adjusting
    tcp_reordering.

    Note that this out of order delivery occurs when both the
    sending and receiving systems are utilizing a multiple
    interface bond.  Consider a configuration in which a
    balance-rr bond feeds into a single higher capacity network
    channel (e.g., multiple 100Mb/sec ethernets feeding a single
    gigabit ethernet via an etherchannel capable switch).  In this
    configuration, traffic sent from the multiple 100Mb devices to
    a destination connected to the gigabit device will not see
    packets out of order.  However, traffic sent from the gigabit
    device to the multiple 100Mb devices may or may not see
    traffic out of order, depending upon the balance policy of the
    switch.  Many switches do not support any modes that stripe
    traffic (instead choosing a port based upon IP or MAC level
    addresses); for those devices, traffic flowing from the
    gigabit device to the many 100Mb devices will only utilize one
    interface.

现在,我将所有线路(4)上两台连接的服务器上的参数从3更改为127。

再次绑定后,我得到约100 MB / s的速度,但仍不超过该速度。

有什么想法吗?

更新:来自的硬件详细信息lspci -v

24:00.0 Ethernet controller: Intel Corporation 82571EB Gigabit Ethernet Controller (rev 06)
        Subsystem: Intel Corporation PRO/1000 PT Dual Port Server Adapter
        Flags: bus master, fast devsel, latency 0, IRQ 24
        Memory at dfe80000 (32-bit, non-prefetchable) [size=128K]
        Memory at dfea0000 (32-bit, non-prefetchable) [size=128K]
        I/O ports at dcc0 [size=32]
        Capabilities: [c8] Power Management version 2
        Capabilities: [d0] MSI: Mask- 64bit+ Count=1/1 Enable-
        Capabilities: [e0] Express Endpoint, MSI 00
        Kernel driver in use: e1000
        Kernel modules: e1000

更新最终结果:

已复制8589934592字节(8.6 GB),35.8489秒,240 MB / s

我更改了很多tcp / ip和低级驱动程序选项。这包括网络缓冲区的扩大。这就是为什么dd现在显示大于200 MB / s的数字的原因:dd终止,同时仍有待传输的输出(在发送缓冲区中)。

更新2011-08-05:为达到目标而更改的设置(/etc/sysctl.conf):

# See http://www-didc.lbl.gov/TCP-tuning/linux.html
# raise TCP max buffer size to 16 MB. default: 131071
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# raise autotuninmg TCP buffer limits
# min, default and max number of bytes to use
# Defaults:
#net.ipv4.tcp_rmem = 4096 87380 174760
#net.ipv4.tcp_wmem = 4096 16384 131072
# Tuning:
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# Default: Backlog 300
net.core.netdev_max_backlog = 2500
#
# Oracle-DB settings:
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
kernel.shmmax = 2147659776
kernel.sem = 1250 256000 100 1024
net.core.rmem_default = 262144
net.core.wmem_default = 262144
#
# Tuning for network-bonding according to bonding.txt:
net.ipv4.tcp_reordering=127

绑定设备的特殊设置(SLES:/ etc / sysconfig / network / ifcfg-bond0):

MTU='9216'
LINK_OPTIONS='txqueuelen 10000'

请注意,设置最大可能的MTU是解决方案的关键。

调整所涉及网卡的rx / tx缓冲区:

/usr/sbin/ethtool -G eth2 rx 2048 tx 2048
/usr/sbin/ethtool -G eth4 rx 2048 tx 2048

您是否检查过/proc/net/bonding/bond0以确保自己确实进入了balance-rr状态?您是否看到注释n您粘贴的有关4接口绑定的文档仅给您带来2.3接口价值的吞吐量?有鉴于此,您似乎不太可能接近所需的2000mb / s。
Zoredache

我不确定LACP /绑定可以在多个物理链接上划分单个TCP会话。
凯达雷2011年

@Kedare,这不是LACP,这是Linux绑定模块自己的循环数据包调度程序,可以将多个链接用于单个TCP会话。
larsk 2011年

1
测试链接上吞吐量的更好方法是使用nuttcp。轻松测试单个连接或多个连接。
MikeyB

Answers:


8

我有一个类似的问题,试图在前一段时间提高两个千兆链接上的drbd同步速度。最后,我设法获得了大约150MB /秒的同步速度。这些是我在两个节点上应用的设置:

ifconfig bond0 mtu 9000
ifconfig bond0 txqueuelen 10000
echo 3000 > /proc/sys/net/core/netdev_max_backlog

如果还没有网卡,还可以尝试启用中断合并(使用ethtool --coalesce


我不知道。在我的情况下不需要。设置这些参数就足够了。但是我想,如果您设置它,不会有任何伤害。传输速度提高了吗?
user842313 2011年

1
我目前无法测试,但是最有可能。您有关“聚结”的提示很可能达到目标。我找到了一篇有趣的文章(德语),有关“高速以太网”设置。巨型帧朝着相同的方向发展-都是为了减少转移工作负载所需的pci中断数。
尼尔斯

如果你是在一些硬件瓶颈思维中断类似限制,如工具collectd有一定帮助,但它需要一些设置的。参见例如此图
user842313 2011年

0

您是否在交换机上配置了此双向中继?如果不是这样,它将无法像这样工作,它将仅在主动/被动模式下工作,并且仅使用1Gbps链路中的1个。


不涉及网络设备。这些是直接交叉电缆。
尼尔斯

5
啊,那么您出于另一个完全不同的原因而失去了运气;诸如此类的LACP /以太网通道中继依赖于目标MAC的第一个(以及适当的第二个和第三个)最低有效位的差异来定义使用哪个中继成员与该MAC进行通信。假设您在中继线的每一端只有一个MAC,则它们永远不会使用多个链路。
斩波器

2
他没有使用etherchannel / 802.3ad,而是在使用balance-rr,确切地说,甚至不需要任何开关支持。
the-wabbit 2011年

@ Chopper3:您认为MAC问题不应出现在RR中吗?
尼尔斯

2
不知道要发表什么评论,有点希望您早些提到这些东西,但是没关系。
Chopper3 2011年

0

看来PowerEdge 6950仅限于PCI插槽,整个总线上共享的PCI插槽最高可达133 MB / s。您可能会看到系统总线体系结构本身的I / O限制。

除了要测试具有不同硬件和I / O架构的其他系统之外,电缆布线也可能会发挥作用。一些可能的组合可能沿着不同的等级(5e vs. 6)以及长度(越短并不总是越好)。


使用并发单行,我已经达到了160 MB / s。但这在绑定后会降至100 MB / s。在每条线上,我的速度接近100 MB / s,因此电缆也不是问题。
尼尔斯

PowerEdge 6950似乎没有任何PCIe支持。其PCI总线有什么不同?尽管如此,你可能会查找的是PowerEdge 6950的IO总线规范
user48838

我用lspci的输出更新了问题。这不是瓶颈。我现在得到200 MB / s。
Nils,

0

巨型帧?

ifconfig <interface> mtu 9000

这样应该减少CPU负载吧?我想知道在这些测试期间CPU在做什么。
SpacemanSpiff

1
使用9000而不是1500的MTU,可以减少传输相同数量数据(有效负载更大)所需的tcp数据包的数量。因此,您在双向上都减少了数据包处理,并发送了更多数据。
Julien Vehent 2011年

这看起来值得一试。在传输过程中,CPU非常空闲。但是我仍然感觉到一个物理链接正在等待ACK,然后内核在另一物理链接上发送下一个数据包。
尼尔斯,

我也很好奇结果。另外,尝试将每个NIC绑定到CPU内核。最新的内核应该可以正确处理该问题,但是我不确定它如何与绑定一起工作。这样做的目的是避免为每个数据包从二级缓存切换到另一个。
Julien Vehent 2011年

CPU负载不是问题。所有卸载选项均已打开...
Nils

0

只要您的开关和NIC支持,执行巨型帧都是巨大的帮助。如果您拥有不受管的siwtch,则很可能您将无法获得所需的带宽,但是如果将交换机上的端口绑定在一起,则情况并非如此。这是我很久以前学到的东西,有65%的时间是物理问题。您在使用六类电缆吗?


0

如果您在NIC上配置了巨型帧,从外观上看,请确保已将交换机配置为也支持高MTU。

巨型帧在千兆位网络上具有出色的性能,但是您需要确保已端对端配置它们(源服务器和目标服务器以及它们使用的网络交换机)。


在这种特殊情况下,不涉及网络设备。(直接交叉线)。这也是唯一(实际)情况,您可以使用RR算法获得单个会话在所有线路上共享的负载。
尼尔斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.