web-dev-qa-db-ja.com

ボンディングドライバーを使用してLinuxで2ギガビットの合計スループットを達成する方法

このアプリケーションでは、スループット全体よりも高可用性に関心があります。サーバー側に1つのIPアドレスがあり、サーバーから1ギガビットを超えるトラフィックを送信できるようにしたい。サーバーには2つの1ギガビットカードがあり、1対のスイッチに接続されています。このアプリケーションには、サーバーに接続している世界中の何千ものリモートクライアントが含まれます(つまり、ローカルネットワークではありません)。

現在、ボンディングはモード5(balance-tlb)を使用して設定されていますが、その結果、各ポートのスループットは500Mbit/sを超えることはありません。どうすればこの制限を超えることができますか?スイッチにアクセスできないため、802.3adを実装できないと想定してください。

(「結合」タグを追加したかったのですが、新しいタグを追加できないため、「チーミング」です。)

5
nobodyfamous

スイッチレベルでの連携なしに2ギガビットを達成することはまずありません。それでも、単一のIPソース/宛先の組み合わせだけでは困難な場合があります。ほとんどのチームは、単一のNICパスを各送信元/宛先に割り当てるIPハッシュ用に設定されています。そのため、1ギガビットしか取得できません。ラウンドロビン方式がありますが、多くの場合、ホストと宛先の両方がそのスキームをサポートしない限り、パケットの到着が順不同で望ましくない。

6
Kevin Kuphal

必要になるだろう ポート集約 スイッチポートで(マシンの2ギガビットポートに配線されているアクセススイッチの2つのポートを集約する必要があります)。しかし、それが達成されると、2 Gbpsパスに近づくはずです(マシンの機能によって制限されます)。

ボンディングドライバーの論理2Gbpsポートと一致するスイッチのポート集約を使用すると、マシン上で1つのIPアドレスのみを持つ多重化冗長パスを使用することになります。

私が今これを調べているのに出くわしたいくつかの興味深いメモがあります、 ここ

Linuxボンディングドライバーのこの素晴らしい機能にはマイナス面があります。これは、インターフェイスが開いているときにMACアドレスを変更できるネットワークインターフェイスでのみ機能します。 balance-albモードは、Swift ARPトリックに依存し、カーネルをだまして、2つの物理インターフェイスがオンザフライでMACアドレスを書き換えることによって1つであると考えます。そのため、インターフェイスのドライバーはこれをサポートする必要があります。そしてそれらの多くはそうではありません。

しかし、ボンディングドライバーができることはそれだけではありません。モードオプションには7つの選択肢があり、インターフェイスの互換性について心配する必要はありません。ただし、スイッチが何をサポートしているかを考慮する必要があります。 balance-rr、balance-xor、およびブロードキャストモードでは、スイッチポートをグループ化する必要があります。これはさまざまな名前で呼ばれるため、「トランクグループ化」、「イーサチャネル」、「ポートアグリゲーション」などを探してください。 802.3adは、スイッチでの802.3adサポートを必要とします。

4
nik

まず、実際には2Gb/sに達することはないことをおそらくご存じでしょう。 TCP/IPのオーバーヘッドにより、おそらく最大値の90%に制限されます。

第2に、TCPオフロードエンジンを使用している場合でも、レイヤー3の上のスタックは、ボトルネックの場所に確実に影響します。つまり、データをどのように送信していますか?10Gb/sNICを使用できます。そして、それらの間のクロスオーバーと、sshトンネルを介してrsyncを使用している場合、数百Mb/sを超えることはありません。

トポロジーについて他に何を教えていただけますか?サーバーはいくつかのスイッチに接続されており、リモートクライアントは世界中にあるとおっしゃいました。 500Mb/s(集計)を超えるWAN接続)がありますか?

3
Matt Simmons

私たちはこの問題を本当に解決しませんでした。私たちが行ったのは、2つのサーバーをセットアップし、1つは各インターフェイスのIPにバインドし、次にここの指示に従って、トラフィックを強制的に着信ポートから送信します。

http://kindlund.wordpress.com/2007/11/19/configuring-multiple-default-routes-in-linux/

私たちの状況に合わせて少し変更しました。この例では、ゲートウェイは192.168.0.1であり、サーバーのIPはeth0とeth1でそれぞれ192.168.0.211と192.168.0.212です。

printf "1\tuplink0\n" >> /etc/iproute2/rt_tables
printf "2\tuplink1\n" >> /etc/iproute2/rt_tables

ip route add 192.168.0.211/32 dev eth0 src 192.168.0.211 table uplink0
ip route add default via 192.168.0.1 dev eth0 table uplink0
ip rule add from 192.168.0.211/32 table uplink0
ip rule add to 192.168.0.211/32 table uplink0

ip route add 192.168.0.212/32 dev eth1 src 192.168.0.212 table uplink1
ip route add default via 192.168.0.1 dev eth1 table uplink1
ip rule add from 192.168.0.212/32 table uplink1
ip rule add to 192.168.0.212/32 table uplink1
1
nobodyfamous