ギガビットボンドが150 MB / s以上のスループットを提供しないのはなぜですか?


17

2つの異なるPCIeアダプターに2つのPowerEdge 6950クロスオーバーを(直線を使用して)直接接続しました。

これらの各回線(1000 MBit、全二重、両方向のフロー制御)でギガビットリンクを取得します。

今、私は両側のrrアルゴリズムを使用してこれらのインターフェイスをbond0に結合しようとしています(単一のIPセッションで2000 MBitを取得したい)。

tddモードでdd bs = 1Mとnetcatを使用して/ dev / zeroを/ dev / nullに転送してスループットをテストすると、予想通り150 MB / sを超える-70 MB / sのスループットが得られます。

単一の回線を使用する場合、各回線で異なる方向を使用すると、各回線で約98 MB /秒になります。単一の回線を使用する場合、トラフィックが「同じ」方向に進むと、回線で70 MB /秒と90 MB /秒になります。

bonding-readme(/usr/src/linux/Documentation/networking/bonding.txt)を読んだ後、次のセクションが有用であることがわかりました:(13.1.1シングルスイッチトポロジのMTボンディングモードの選択)

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

bond-deviceの特別な設定(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に設定されていることを確認するためにチェックしましたか?4インターフェースボンドについて貼り付けたドキュメントでは、2.3インターフェースに相当するスループットしか得られないという注意書きはありましたか?そのメモを考えると、あなたが望む2000mb / sに近づくことはほとんどありそうにない。
ゾレダチェ

LACP / Bondingが複数の物理リンクで単一のTCPセッションを分割できるかどうかはわかりません。
ケダレ

@Kedare、これはLACPではありません。これは、単一のTCPセッションに複数のリンクを利用できるLinuxボンディングモジュール独自のラウンドロビンパケットスケジューラです。
ラースク

1
リンクのスループットをテストするより良い方法は、を使用することnuttcpです。単一の接続または複数の接続を簡単にテストします。
MikeyB

回答:


8

しばらく前に、2つのギガビットリンクでdrbd同期の速度を上げようとすると、同様の問題が発生しました。最終的に、同期速度は約150MB /秒になりました。これらは両方のノードに適用した設定です。

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

ネットワークカードをまだ持っていない場合は、割り込み合体を有効にすることもできます(ethtool --coalesceを使用


知りません。私の場合は必要ありませんでした。これらのパラメーターを設定するだけで十分でした。ただし、設定しても問題はないと思います。転送速度は改善しましたか?
ユーザー842313

1
私は現在それをテストすることはできませんが、最も適切にテストします。「合体」に関するあなたのヒントは、おそらくマークに当たります。「高速イーサネット」設定に関する興味深い記事(ドイツ語)を見つけました。ジャンボフレームは同じ方向に進みます。ワークロードを転送するために必要なpci割り込みの数を減らすことがすべてです。
ニルス

割り込み制限などのハードウェアボトルネックを考えている場合は、collectdなどのツールが役立ちますが、少しセットアップが必要になります。たとえば、次のグラフを
user842313

0

スイッチでこの双方向トランクを構成しましたか?そうでない場合は、そのようには動作しません。アクティブ/パッシブモードで動作し、1Gbpsリンクの1つだけを使用します。


関与するネットワークデバイスはありません。これらは直接クロスオーバーケーブルです。
ニルス

5
ああ、だからあなたはまったく別の理由で運が悪い。このようなLACP / Etherchannelトランクは、宛先MACの最初(および適切な場合は2番目と3番目)の最下位ビットの分散に依存して、そのMACとの通信に使用されるトランクメンバーを定義します。各端のトランクにMACが1つしかない場合、複数のリンクを使用することはありません。
チョッパー

2
彼はetherchannel / 802.3adを使用しておらず、balance-rrを使用しています。正確には、スイッチのサポートさえ必要としません。
the-wabbit

@ Chopper3:だからあなたの意見ではMAC問題はRRに表示されるべきではないのですか?
ニルス

2
コメントするのに十分なことを知らないでください。ちょっと前にそのようなことを言ってくれたらいいのにと思いますが、気にしないでください。
チョッパー

0

PowerEdge 6950は、バス全体で133 MB / sで共有されるPCIスロットに制限されているようです。システムバスアーキテクチャ自体にI / Oの制限があります。

テストするハードウェアとI / Oアーキテクチャが異なる他のシステムのほかに、ケーブル配線も同様に機能する可能性があります。いくつかの可能な組み合わせは、異なる評価(5e対6)と長さの線に沿っている場合があります(短いほど良いとは限りません)。


私はすでに160 MB / sを取得しました-並行単一行を使用しています。ただし、これはボンディング時に100 MB / sに低下します。単一の回線ごとに100 MB / s近くを取得するので、ケーブルも問題ではないようです。
ニルス

PowerEdge 6950のPCIeサポートはないようです。PCIバスで何か「違う」ものはありますか?それにもかかわらず、PowerEdge 6950のIOバス仕様を調べることができます。
user4883811

質問をlspciの出力で更新しました。これはボトルネックではありませんでした。200 MB /秒を取得しました。
ニルス

0

ジャンボフレーム?

ifconfig <interface> mtu 9000

これにより、CPUの負荷を減らすことができますか?これらのテスト中にCPUが何をしているのだろうか。
SpacemanSpiff

1
1500ではなく9000のMTUを使用すると、同じ量のデータを転送する必要があるtcpデータパケットの数を減らすことができます(ペイロードが大きくなります)。そのため、両側および双方向でパケット処理が少なくなり、より多くのデータを送信できます。
ジュリアンベヘント

これは試してみる価値があるようです。CPUは転送中はかなりアイドル状態です。しかし、カーネルが他の物理リンクで次のパケットを送信する前に、1つの物理リンクがACKを待機していると感じています。
ニルス

私も結果に興味があります。また、各NICをCPUコアにバインドしてみてください。最近のカーネルはそれを適切に処理する必要がありますが、ボンディングでどのように機能するかわかりません。アイデアは、パケットごとにl2キャッシュから別のキャッシュへの切り替えを避けることです。
ジュリアンベヘント

CPUの負荷は問題ではありません。すべてのオフロードオプションがオンになっています...
Nils

0

ジャンボフレームを実行することは、スイッチとNICがそれをサポートしている限り、非常に役立ちます。管理されていないsiwtchがある場合、帯域幅に必要な場所を取得できない可能性が高くなりますが、スイッチでポートを一緒にバインドする場合はそうではありません。ここに、私がずっと前に学んだ、65%の時間の物理的な問題があります。cat6ケーブルを使用していますか?


0

NICでジャンボフレームを設定している場合は、見た目でスイッチが高MTUをサポートするように設定されていることを確認してください。

ジャンボフレームは、ギガビットネットワーク上で優れたパフォーマンスを発揮しますが、エンドツーエンド(送信元サーバーと送信先サーバー、およびそれらが使用するネットワークスイッチの両方)を確実に構成する必要があります。


この特殊なケースに関係するネットワークデバイスはありません。(直接クロスオーバーライン)。これは、RRアルゴリズムを使用して、単一セッションのすべての回線で負荷を共有できる唯一の(実際の)ケースでもあります。
ニルス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.