2012年4月17日火曜日

スイッチ、ルータのポートチャネルのバランシング方式の変更



【問題発生】
CISCOのスイッチ、ルータ間で4G(1G×4本)のポートチャネルを組んでいたが、
各ポートでトラフィックが均等に分散されず、一部のポートだけが上限の1Gに達しそうになった。

あるポートの1G帯域が埋まると、別ポートには余裕があっても
トラフィックはそちらのポートにすべることはなく、パケットがドロップされてしまう。

補足。
パケットがドロップされていることは、ネットワーク機器側で
以下のコマンドを実行し OutDiscards という値が増加しているかどうかで確認できる。

# show interfaces counters errors

ただし、サーバ側で ifconfig コマンドの結果から読み取れる dropped の値や、
netstat -i コマンドからの RX-DRPTX-DRP の値は参考にならない。
サーバ側のインターフェース側でエラーを出したものしかカウントされないためである。
つまり、ネットワーク経路上のロスは見えてこない

サーバ側で確認するならば netstat -s コマンドの結果のTCPの send out を見ればよいだろう。
TCPが再送されていることから間接的にパケットのロスを判断できる。
コマンドで確認せずとも、エラーパケット数の推移はグラフで描いておくと把握しやすい。



【簡易構成】
1G × 4本 = 4Gの帯域(赤色の部分)

    サーバ群1(10台)
   |           |
スイッチ1 スイッチ2
   |           |
ルータ1    ルータ2
   |           |
スイッチ3 スイッチ4
   |           |
    サーバ群2(10台)


スイッチ1側コンフィグ抜粋
interface Port-channel1
 description to [スイッチ1 GE0/1-4]
!
interface Port-channel2
 description to [ルータ2 GE0/5-8]
!
interface GigabitEthernet0/1
 channel-group 1 mode on



interface GigabitEthernet0/4
 channel-group 1 mode on

interface GigabitEthernet0/5
 channel-group 2 mode on



interface GigabitEthernet0/8
 channel-group 2 mode on



【対策】
各スイッチ、ルータのポートチャネルのロードバランシング方式を変更する。

バランシング方式には以下の6つの方式がある。
(config)# port-channel load-balance ?
  dst-ip       Dst IP Addr
  dst-mac      Dst Mac Addr
  src-dst-ip   Src XOR Dst IP Addr
  src-dst-mac  Src XOR Dst Mac Addr
  src-ip       Src IP Addr
  src-mac      Src Mac Addr

ディフォルトはsrc-mac方式なのだが、今回のようにサーバ台数が少ないと
母集団が少なくなるため、標本抽出した際に偏りが出ることを避けにくい。

そこで、母集団を増やすためにsrcとdstの経路を元に、
バランシングに利用するハッシュ値を決めさせるため、
src-dst-ip方式を利用する。

つまり、10通りのハッシュ値を、
サーバ群1の10台 × サーバ群2の10台 = 100通り
にするのである。



【作業前の確認点】

Q. トラフィックが流れている状態で変更した場合、処理中のトラフィックはどうなるか?

A. 処理中のトラフィックだけはドロップされる。
ただし、TCP通信であれば再送されるため、目に見えた影響はない。


Q. 今回のようにポートチャネルを複数組んでいる場合、つまり、Po1、Po2とあった場合、
上記のコマンドではPo1、Po2共に変更されてしまう。
そこで、どちらかのポートチャネルを先に変更することははできるか?

A. できない。


Q. バランシングするための計算は毎回再計算されるのか、記憶されるのか?

A. パケットを受け取ったタイミングでハッシュ値がそのつど計算されバランシング先が決定する。


Q. なぜmac、またはipといった2つの方式があるのか?

A. さまざまなフローにおいて有効にバランシングされるように設定に柔軟さを
もたせているためである。それぞれにメリットとデメリットがあるわけではない。



【変更作業手順】
全スイッチ、ルータで実施する。

特権モードへ入る。
> enable

既存の振り分けの確認
# show interfaces GigabitEthernet XX

# test etherchannel load-balance interface port-channel $ポートチャネル番号 mac $src-mac $dst-mac
※$~は環境に合わせてかえること。
※src-mac方式であってもコマンド上は送信先のmacアドレスは必要である。
当然src-mac方式ではdst-macによって振り分けは変わらない。 

設定変更
# config terminal
(config)# port-channel load-balance src-dst-ip


リソース確認
# show processes cpu

# show processes memory


設定変更後の振り分けの確認
# show interfaces GigabitEthernet XX

# test etherchannel load-balance interface port-channel $ポートチャネル番号 ip $src-ip $dst-ip


その他、CISCOのネットワーク機器を扱うならport-channetにvlanを追加する際の注意点
参考にしておくべきである。