CEF によるトラフィック分散
数年前、Cisco のパケット転送方式である CEF(Cisco Express Forwarding)を検証した際の履歴を公開します。Cisco の公式ドキュメント「CEF を使用したパラレル リンクでのロード バランシングに関するトラブルシューティング」を参考にし、(たしか)Cisco7200 を 4 台使って検証しました。検証時点から随分、時間が立っており、最新の IOS とは異なる部分があるかも知れません。
構成図
R2 〜 R3 間は 4 つのリンクで接続されています。
R2 〜 R3 は OSPF が設定されており、ECMP(Equal Cost Multi Path - 等コストマルチパス)になっています。
1
2
3
4
5
6
7
8
9
10
11
12
13 | R2> show ip route 192.168.2.0
Routing entry for 192.168.2.0/24
Known via "ospf 10", distance 110, metric 20, type intra area
Last update from 10.0.2.2 on Ethernet1/2, 00:23:31 ago
Routing Descriptor Blocks:
* 10.0.4.2, from 192.168.2.1, 00:23:31 ago, via Ethernet1/4
Route metric is 20, traffic share count is 1
10.0.3.2, from 192.168.2.1, 00:23:31 ago, via Ethernet1/3
Route metric is 20, traffic share count is 1
10.0.2.2, from 192.168.2.1, 00:23:31 ago, via Ethernet1/2
Route metric is 20, traffic share count is 1
10.0.1.2, from 192.168.2.1, 00:23:31 ago, via Ethernet1/1
Route metric is 20, traffic share count is 1
|
負荷分散される最大パス数
Maximum path はデフォルトで 4 になっており、ECMP なパスが 4 つあれば、4 分散されます。現在の Maximum path 設定は "show ip protocols" で確認できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | R2> show ip protocols
Routing Protocol is "ospf 10"
Outgoing update filter list for all interfaces is not set
Incoming update filter list for all interfaces is not set
Router ID 192.168.1.1
Number of areas in this router is 1. 1 normal 0 stub 0 nssa
Maximum path: 4
Routing for Networks:
0.0.0.0 255.255.255.255 area 0.0.0.0
Reference bandwidth unit is 100 mbps
Passive Interface(s):
Ethernet1/0
Routing Information Sources:
Gateway Distance Last Update
192.168.2.1 110 00:26:30
Distance: (default is 110)
|
Maximum path は最大 16 まで設定できます。 最近の Cisco1812J で試したところ、32path まで設定出来るようでした。
| R2(config)# router ospf 10
R2(config-router)# maximum-paths ?
<1-16> Number of paths
R2(config-router)# maximum-paths 3
|
Maximum path が 3 に設定された為、ルーティングテーブル上に ECMP される経路が 3 つしか表示されなくなりました。
| R2# show ip route 192.168.2.0
Routing entry for 192.168.2.0/24
Known via "ospf 10", distance 110, metric 20, type intra area
Last update from 10.0.1.2 on Ethernet1/1, 00:03:04 ago
Routing Descriptor Blocks:
* 10.0.4.2, from 192.168.2.1, 00:03:04 ago, via Ethernet1/4
Route metric is 20, traffic share count is 1
10.0.3.2, from 192.168.2.1, 00:03:04 ago, via Ethernet1/3
Route metric is 20, traffic share count is 1
10.0.1.2, from 192.168.2.1, 00:03:04 ago, via Ethernet1/1
Route metric is 20, traffic share count is 1
|
スイッチングメカニズムの概要
Cisco のスイッチングメカニズムは、大きく分けて次の 4 つがあります。Cisco7500 など、特定のプラットフォームでのみ動作するオプティマイズスイッチングなどは、説明しません。
- 宛先単位でのスイッチング
- 宛先単位のファストスイッチング
- 宛先単位の CEF
- パケット単位でのスイッチング
- パケット単位のプロセススイッチング
- パケット単位の CEF
それぞれ次のような特徴を持ちます。
- 宛先単位のファストスイッチング
- 複数のパスがあったとき、同じ宛先に対しては同じパスが使われるます。よって、パケットの追い越し問題は発生せず、VoIP などのトラフィックフローにも適応できます。特定の宛先へのトラフィックが多い場合は特定パスへトラフィックが偏ることになります。
- 宛先単位の CEF
- 複数のパスがあったとき、同じ送信元と宛先に対しては同じパスが使われます。よって、パケットの追い越し問題は発生せず、VoIP などのトラフィックフローにも適応できます。ファストスイッチングと異なり、同じ宛先へのトラフィックが集中したとしても、送信元が異なれば利用されるリンクは分散される可能性があります。送信元と宛先のペアがひとつしか無かったり、少ない場合は特定パスへトラフィックが偏る可能性があります。
- パケット単位のプロセススイッチング&CEF
- パケットごとにラウンドロビンされたパスが使われます。送信元や宛先の数に依存せず、パケットは複数のパス上で分散されます。ただし、送信元や宛先が同じパケットも違うパスに分散されてしまう可能性がある為、パケットの追い越し問題を考慮しなければならない VoIP などのトラフィックフローがある場合は設定すべきではありません。
「宛先単位」の場合はファストスイッチング、「パケット単位」の場合はプロセススイッチングが使われます。CEF は「宛先単位」「パケット単位」の両方に対応しており、デフォルトでは「宛先単位」で処理されます。現在の設定は "show cef interface" で確認出来ます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | R2# show cef interface Ethernet 1/1
Ethernet1/1 is up (if_number 6)
Corresponding hwidb fast_if_number 6
Corresponding hwidb firstsw->if_number 6
Internet address is 10.0.1.1/30
ICMP redirects are always sent
Per packet load-sharing is disabled
IP unicast RPF check is disabled
Inbound access list is not set
Outbound access list is not set
Hardware idb is Ethernet1/1
Fast switching type 1, interface type 61
IP CEF switching enabled
IP Fast switching turbo vector
IP Normal CEF switching turbo vector
Input fast flags 0x0, Input fast flags2 0x0, Output fast flags 0x0, Output fast flags2 0x0
ifindex 4(4)
Slot 1 Slot unit 1 Unit 2 VC -1
Transmit limit accumulator 0x0 (0x0)
IP MTU 150
|
「パケット単位」に変更したい場合は "ip load-sharing per-packet" で設定出来ます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 | R2# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)# interface Ethernet 1/1
R2(config-if)# ip load-sharing ?
per-destination Deterministic distribution
per-packet Random distribution
R2(config-if)# ip load-sharing per-packet
R2(config-if)# end
R2#
R2# show cef interface Ethernet 1/1
Ethernet1/1 is up (if_number 6)
Corresponding hwidb fast_if_number 6
Corresponding hwidb firstsw->if_number 6
Internet address is 10.0.1.1/30
ICMP redirects are always sent
Per packet load-sharing is enabled
IP unicast RPF check is disabled
Inbound access list is not set
Outbound access list is not set
Hardware idb is Ethernet1/1
Fast switching type 1, interface type 61
IP CEF switching enabled
IP Fast switching turbo vector
IP Normal CEF switching turbo vector
Input fast flags 0x0, Input fast flags2 0x0, Output fast flags 0x0, Output fast flags2 0x0
ifindex 4(4)
Slot 1 Slot unit 1 Unit 2 VC -1
Transmit limit accumulator 0x0 (0x0)
IP MTU 150
|
CEF による負荷分散の内部メカニズム
CEF はパケットをハッシュバケットに割り当てます。各ハッシュバケットはインターフェイスに紐付いており、パケットがハッシュバケットに割り当てられると、そのハッシュバケットに紐付けられたインターフェイスを使って、パケットが送信されます。パケットの宛先ごとに 16 個のハッシュバケットが用意されており、「ハッシュバケットとインターフェイスの紐付け」は "show ip cef ''宛先アドレス'' internal" で確認出来ます。
以下は R2 で 192.168.2.0 宛てへのパケットに対するハッシュバケットの割り当て状態を確認しています。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | R2> show ip cef 192.168.2.0 internal
192.168.2.0/24, version 43, epoch 0, per-destination sharing
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.2.2, Ethernet1/2, 0 dependencies
traffic share 1
next hop 10.0.2.2, Ethernet1/2
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 (refcount 1)
Hash OK Interface Address Packets
1 Y Ethernet1/4 10.0.4.2 0
2 Y Ethernet1/3 10.0.3.2 0
3 Y Ethernet1/2 10.0.2.2 0
4 Y Ethernet1/1 10.0.1.2 0
5 Y Ethernet1/4 10.0.4.2 0
6 Y Ethernet1/3 10.0.3.2 0
7 Y Ethernet1/2 10.0.2.2 0
8 Y Ethernet1/1 10.0.1.2 0
9 Y Ethernet1/4 10.0.4.2 0
10 Y Ethernet1/3 10.0.3.2 0
11 Y Ethernet1/2 10.0.2.2 0
12 Y Ethernet1/1 10.0.1.2 0
13 Y Ethernet1/4 10.0.4.2 7857
14 Y Ethernet1/3 10.0.3.2 0
15 Y Ethernet1/2 10.0.2.2 0
16 Y Ethernet1/1 10.0.1.2 0
refcount 6
|
Hash が 1 〜 16 まで表示されており、ハッシュバケットが 16 個、用意されており、Hash1 は Ethernet1/4 に、Hash2 は Ethernet1/3 に、という具合にハッシュバケットとインターフェイスが紐付けられていることが分かります。Load distribution は「0 1 2 3」「0 1 2 3」「0 1 2 3」「0 1 2 3」のように「0 1 2 3」を繰り返し表示しており、4 つのインターフェイスを繰り返して使っていることが分かります。
つまり、トラフィックフローごとに次のように送信インターフェイスが決定されます。
フロー番号 |
送信インターフェイス |
備考 |
1 |
Ethernet1/4 |
|
2 |
Ethernet1/3 |
|
3 |
Ethernet1/2 |
|
4 |
Ethernet1/1 |
次は Eth1/4 へ戻る |
5 |
Ethernet1/4 |
|
6 |
Ethernet1/3 |
|
7 |
Ethernet1/2 |
|
8 |
Ethernet1/1 |
次は Eth1/4 へ戻る |
9 |
Ethernet1/4 |
|
10 |
Ethernet1/3 |
|
11 |
Ethernet1/2 |
|
12 |
Ethernet1/1 |
次は Eth1/4 へ戻る |
13 |
Ethernet1/4 |
|
14 |
Ethernet1/3 |
|
15 |
Ethernet1/2 |
|
16 |
Ethernet1/1 |
フローの 1 番へ戻る |
Hash1 は Ethernet1/4(NextHop のアドレスは 10.0.4.2)に割り当てられており、Hash1 が使われる場合は NextHop である 10.0.4.2 を目がけて、Ethernet1/4 からパケットが送信されることも分かります。
ECMP 出来るパスが 3 つしか無い場合、16 個のハッシュバケットを使い切ることが出来ません(16 は 3 で割り切れない為です)。この場合、3 の場合で最も 16 に近い「15」個のハッシュバケットが使われ、16 番目のハッシュバケットは使われません。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | R2# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)# router ospf 10
R2(config-router)# maximum-paths 3
R2(config-router)# end
R2#
R2# show ip cef 192.168.2.0 internal
192.168.2.0/24, version 44, epoch 0, per-destination sharing
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 2 0 1 2 0 1 2 0 1 2 0 1 2 (refcount 1)
Hash OK Interface Address Packets
1 Y Ethernet1/4 10.0.4.2 0
2 Y Ethernet1/3 10.0.3.2 0
3 Y Ethernet1/1 10.0.1.2 0
4 Y Ethernet1/4 10.0.4.2 0
5 Y Ethernet1/3 10.0.3.2 0
6 Y Ethernet1/1 10.0.1.2 0
7 Y Ethernet1/4 10.0.4.2 0
8 Y Ethernet1/3 10.0.3.2 0
9 Y Ethernet1/1 10.0.1.2 0
10 Y Ethernet1/4 10.0.4.2 0
11 Y Ethernet1/3 10.0.3.2 0
12 Y Ethernet1/1 10.0.1.2 0
13 Y Ethernet1/4 10.0.4.2 0
14 Y Ethernet1/3 10.0.3.2 0
15 Y Ethernet1/1 10.0.1.2 0
refcount 6
|
Hash16 の表示が無く、ハッシュバケットの総数が 15 であることが分かります。
トラフィックフローごとのパスの選択
パスがどのように選択されるかは、「宛先単位」なのか、「パケット単位なのか」により、異なり。つまり、16 個のパスがあるからと言って 16 パスが並行して使われる、というわけではありません。もっと言えば、4 つのリンクで ECMP しているからと言って、トラフィックが 4 つのリンクで分散される、というわけではありません。
実際に検証してみます。ここでは CEF を「宛先単位」にし、Maximum path は 4 に設定しています。
CEF の有効 / 無効を確認する
デフォルトで CEF は有効です(CEF が無効化されているということは、トラフィックが CEF ではなく、ファストスイッチングやプロセススイッチングなど、その他のスイッチングメカニズムで処理されている、ということです)。CEF の有効 / 無効は "show ip cef" で確認出来ます。無効化されている場合は、次のように表示されます。
| R2# show ip cef
%CEF not running
Prefix Next Hop Interface
|
CEF を有効化するには "ip cef" を設定します。"show ip cef" で確認した際、「%CEF not running」と表示されず、経路情報が表示されれば CEF は有効化されています。
| R2# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)# ip cef
R2(config)# end
R2#
R2# show ip cef
Prefix Next Hop Interface
0.0.0.0/0 drop Null0 (default route handler entry)
0.0.0.0/32 receive
10.0.1.0/30 attached Ethernet1/1
|
インターフェイスごとの CEF 設定を確認する
デフォルトでは「宛先単位ごとの負荷分散アルゴリズム」が採用されています。インターフェイスごとの CEF の有効 / 無効と、負荷分散アルゴリズムは "show cef interface ''インターフェイス名''" で確認できます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | R2# show cef interface e1/1
Ethernet1/1 is up (if_number 6)
Corresponding hwidb fast_if_number 6
Corresponding hwidb firstsw->if_number 6
Internet address is 10.0.1.1/30
ICMP redirects are always sent
Per packet load-sharing is disabled
!--- パケット単位の分散が無効化されているので宛先単位設定になっています
IP unicast RPF check is disabled
Inbound access list is not set
Outbound access list is not set
Hardware idb is Ethernet1/1
Fast switching type 1, interface type 61
IP CEF switching enabled
!--- このインターフェイスで CEF は有効化されています
IP Fast switching turbo vector
IP Normal CEF switching turbo vector
Input fast flags 0x0, Input fast flags2 0x0, Output fast flags 0x0, Output fast flags2 0x0
ifindex 4(4)
Slot 1 Slot unit 1 Unit 2 VC -1
Transmit limit accumulator 0x0 (0x0)
IP MTU 1500
|
RIB を確認する
RIB(Routing Information Base)はルーティングテーブルのことです。RIB に経路がインストールされていることを確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13 | R2# show ip route 192.168.2.0
Routing entry for 192.168.2.0/24
Known via "ospf 10", distance 110, metric 20, type intra area
Last update from 10.0.2.2 on Ethernet1/2, 03:02:26 ago
Routing Descriptor Blocks:
* 10.0.4.2, from 192.168.2.1, 03:02:26 ago, via Ethernet1/4
Route metric is 20, traffic share count is 1
10.0.3.2, from 192.168.2.1, 03:02:26 ago, via Ethernet1/3
Route metric is 20, traffic share count is 1
10.0.2.2, from 192.168.2.1, 03:02:26 ago, via Ethernet1/2
Route metric is 20, traffic share count is 1
10.0.1.2, from 192.168.2.1, 03:02:26 ago, via Ethernet1/1
Route metric is 20, traffic share count is 1
|
FIB を確認する
Forwarding Information Base(FIB)は CEF フォワーディングテーブルのことです。FIB に経路がインストールされていることを確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | R2# show ip cef 192.168.2.0
192.168.2.0/24, version 32, epoch 0, per-destination sharing
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.2.2, Ethernet1/2, 0 dependencies
traffic share 1
next hop 10.0.2.2, Ethernet1/2
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
|
隣接関係を確認する
CEF の隣接関係を確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | R2# show adjacency detail
Protocol Interface Address
IP Ethernet1/1 10.0.1.2(10)
0 packets, 0 bytes
CA02115C001D
CA01115C001D0800
ARP 02:40:21
Epoch: 0
IP Ethernet1/2 10.0.2.2(10)
0 packets, 0 bytes
CA02115C001E
CA01115C001E0800
ARP 02:40:21
Epoch: 0
IP Ethernet1/3 10.0.3.2(10)
0 packets, 0 bytes
CA02115C001F
CA01115C001F0800
ARP 03:22:21
Epoch: 0
IP Ethernet1/4 10.0.4.2(10)
0 packets, 0 bytes
CA02115C0020
CA01115C00200800
Protocol Interface Address
ARP 02:40:19
Epoch: 0
IP Ethernet1/0 192.168.1.10(5)
0 packets, 0 bytes
CA00115C001C
CA01115C001C0800
ARP 03:20:19
Epoch: 0
|
統計情報を有効にする
統計情報を有効にすると、ハッシュバケットの使われた回数(頻度)、スイッチングされたパケットの数やバイト数が記録され、トラフィックパターンを分析するのに役立ちます。統計情報を有効にするには "ip cef accounting load-balance-hash" を使います。ヘルプでは補完されないコマンドのようです。
| R2# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)# ip cef accounting ?
non-recursive Enable accounting for traffic through non-recursive prefixes
per-prefix Enable per prefix accounting
prefix-length Enable prefix length accounting
R2(config)# ip cef accounting load-balance-hash
R2(config)#
|
R1 から R4 へ 100 発、Ping を実行しました。Hash13 が使われていることが分かります(他のトラフィックは流れておらず、Hash13 以外のハッシュバケットは使われていません)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | R2# show ip cef 192.168.2.0 internal
192.168.2.0/24, version 32, epoch 0, per-destination sharing
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.2.2, Ethernet1/2, 0 dependencies
traffic share 1
next hop 10.0.2.2, Ethernet1/2
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 (refcount 1)
Hash OK Interface Address Packets
1 Y Ethernet1/4 10.0.4.2 0
2 Y Ethernet1/3 10.0.3.2 0
3 Y Ethernet1/2 10.0.2.2 0
4 Y Ethernet1/1 10.0.1.2 0
5 Y Ethernet1/4 10.0.4.2 0
6 Y Ethernet1/3 10.0.3.2 0
7 Y Ethernet1/2 10.0.2.2 0
8 Y Ethernet1/1 10.0.1.2 0
9 Y Ethernet1/4 10.0.4.2 0
10 Y Ethernet1/3 10.0.3.2 0
11 Y Ethernet1/2 10.0.2.2 0
12 Y Ethernet1/1 10.0.1.2 0
13 Y Ethernet1/4 10.0.4.2 100
14 Y Ethernet1/3 10.0.3.2 0
15 Y Ethernet1/2 10.0.2.2 0
16 Y Ethernet1/1 10.0.1.2 0
refcount 6
|
統計情報をリセットできる clear コマンドは存在しないようですが、トラフィックフローに関連するインターフェイスを "shutdown" や "no shutdown" し、ハッシュバケットの使われ方が再計算されると統計情報はクリアされるようです。
トラフィックを確認する
R1 から R4 への Ping を実行したまま、"show interfaces" で時間単位のトラフィックを確認すると、確かに Out トラフィックは Ethernet1/4 に偏っていることが分かります。また、In トラフィックは Ethernet1/3 に偏っています。
1
2
3
4
5
6
7
8
9
10
11
12
13 | R2# show interfaces | include Ethernet1/[1-4]|second
Ethernet1/1 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 0 bits/sec, 0 packets/sec
Ethernet1/2 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 0 bits/sec, 0 packets/sec
Ethernet1/3 is up, line protocol is up
30 second input rate 4000 bits/sec, 5 packets/sec
30 second output rate 0 bits/sec, 0 packets/sec
Ethernet1/4 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 4000 bits/sec, 5 packets/sec
|
これは「宛先単位」の CEF が同じ送信元・同じ宛先のトラフィックは同じフローとみなし、同じパスを割り当てようとする為、正しい動作です。今回は R1 から R4 への Ping ですので、具体的には「192.168.1.10 から 192.168.2.10 へのトラフィック」になります。このトラフィックフローが割り当てられるハッシュバケットは "show ip cef exact-route ''送信元アドレス'' ''宛先アドレス'' internal" で確認出来ます。
| R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/4 (next hop 10.0.4.2)
Bucket 12 from 16, total 4 path
|
ここでは「ゼロ始まり」でハッシュバケットが表示される為、「Bucket12」と表示されている、ということは "show ip cef ''宛先アドレス'' internal" で表示されるハッシュバケットのうち 13 番が使われることになります。
R3 で戻りのトラフィック(192.168.2.10 から 192.168.1.10 へのトラフィック)を確認すると Ethernet1/3 が選択されており、R2 での In トラフィックが Ethernet1/3 に偏っていた理由が分かります。
| R3# show ip cef exact-route 192.168.2.10 192.168.1.10 internal
192.168.2.10 -> 192.168.1.10 : Ethernet1/3 (next hop 10.0.3.1)
Bucket 1 from 16, total 4 paths
|
パケット単位の負荷分散に変更する
負荷分散アルゴリズムをパケット単位に変更してみます。インターフェイスごとに "ip load-sharing per-packet" を設定します。例えば 4 つの ECMP パスのうち、半分を宛先単位、残りの半分をパケット単位に変更し、混在させることも出来ますが、やや複雑になる為、今回は混在するケースを除外して考えます(全てのインターフェイスでアルゴリズムをパケット単位に変更したケースを考えます)。
1
2
3
4
5
6
7
8
9
10
11
12
13 | R2# conf t
Enter configuration commands, one per line. End with CNTL/Z.
R2(config)# interface Ethernet1/1
R2(config-if)# ip load-sharing per-packet
R2(config-if)#
R2(config-if)# interface Ethernet1/2
R2(config-if)# ip load-sharing per-packet
R2(config-if)#
R2(config-if)# interface Ethernet1/3
R2(config-if)# ip load-sharing per-packet
R2(config-if)#
R2(config-if)# interface Ethernet1/4
R2(config-if)# ip load-sharing per-packet
|
"show ip cef ''宛先アドレス'' internal" で該当のトラフィックフローがパケット単位に変更されたことを確認します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 | R2# show ip cef 192.168.2.0 internal
192.168.2.0/24, version 40, epoch 0, per-packet sharing
!--- パケット単位に変更されています
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1, current path
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.2.2, Ethernet1/2, 0 dependencies
traffic share 1
next hop 10.0.2.2, Ethernet1/2
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 (refcount 1)
Hash OK Interface Address Packets
1 Y Ethernet1/4 10.0.4.2 0
2 Y Ethernet1/3 10.0.3.2 0
3 Y Ethernet1/2 10.0.2.2 0
4 Y Ethernet1/1 10.0.1.2 0
5 Y Ethernet1/4 10.0.4.2 0
6 Y Ethernet1/3 10.0.3.2 0
7 Y Ethernet1/2 10.0.2.2 0
8 Y Ethernet1/1 10.0.1.2 0
9 Y Ethernet1/4 10.0.4.2 0
10 Y Ethernet1/3 10.0.3.2 0
11 Y Ethernet1/2 10.0.2.2 0
12 Y Ethernet1/1 10.0.1.2 0
13 Y Ethernet1/4 10.0.4.2 0
14 Y Ethernet1/3 10.0.3.2 0
15 Y Ethernet1/2 10.0.2.2 0
16 Y Ethernet1/1 10.0.1.2 0
refcount 6
|
再度、R1 から R4 への Ping トラフィックを発生させ、R2 でトラフィックを確認してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13 | R2# show interfaces | include Ethernet1/[1-4]|second
Ethernet1/1 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 6000 bits/sec, 6 packets/sec
Ethernet1/2 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 6000 bits/sec, 7 packets/sec
Ethernet1/3 is up, line protocol is up
30 second input rate 17000 bits/sec, 19 packets/sec
30 second output rate 6000 bits/sec, 6 packets/sec
Ethernet1/4 is up, line protocol is up
30 second input rate 0 bits/sec, 0 packets/sec
30 second output rate 6000 bits/sec, 7 packets/sec
|
Out トラフィックが 4 つの ECMP パスで均等に分散されているのが分かります(R3 では何も変更しておらず、宛先単位のままである為、戻りパケットは分散されず、相変わらず Ethernet1/3 に偏っているのが分かります)。ハッシュバケットの状態も確認してみます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | R2# show ip cef 192.168.2.0 internal
192.168.2.0/24, version 40, epoch 0, per-packet sharing
0 packets, 0 bytes
via 10.0.4.2, Ethernet1/4, 0 dependencies
traffic share 1
next hop 10.0.4.2, Ethernet1/4
valid adjacency
via 10.0.3.2, Ethernet1/3, 0 dependencies
traffic share 1, current path
next hop 10.0.3.2, Ethernet1/3
valid adjacency
via 10.0.2.2, Ethernet1/2, 0 dependencies
traffic share 1
next hop 10.0.2.2, Ethernet1/2
valid adjacency
via 10.0.1.2, Ethernet1/1, 0 dependencies
traffic share 1
next hop 10.0.1.2, Ethernet1/1
valid adjacency
0 packets, 0 bytes switched through the prefix
tmstats: external 0 packets, 0 bytes
internal 0 packets, 0 bytes
Load distribution: 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 (refcount 1)
Hash OK Interface Address Packets
1 Y Ethernet1/4 10.0.4.2 15
2 Y Ethernet1/3 10.0.3.2 15
3 Y Ethernet1/2 10.0.2.2 15
4 Y Ethernet1/1 10.0.1.2 15
5 Y Ethernet1/4 10.0.4.2 14
6 Y Ethernet1/3 10.0.3.2 14
7 Y Ethernet1/2 10.0.2.2 14
8 Y Ethernet1/1 10.0.1.2 14
9 Y Ethernet1/4 10.0.4.2 14
10 Y Ethernet1/3 10.0.3.2 14
11 Y Ethernet1/2 10.0.2.2 14
12 Y Ethernet1/1 10.0.1.2 14
13 Y Ethernet1/4 10.0.4.2 14
14 Y Ethernet1/3 10.0.3.2 14
15 Y Ethernet1/2 10.0.2.2 14
16 Y Ethernet1/1 10.0.1.2 14
refcount 6
|
Hash1 〜 Hash16 までが均等に使われ、同じ送信元・同じ宛先を持つトラフィックフローに対してもパケット単位の負荷分散が実行されていることが分かります。
"show ip cef exact-route ''送信元アドレス'' ''宛先アドレス'' internal" で次に使われるハッシュバケットを確認しても、次に使われるハッシュバケットが変化していることが分かります(手動で実行している為、連番にはなりません)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/3 (next hop 10.0.3.2)
Bucket 13 from 16, total 4 paths
R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/3 (next hop 10.0.3.2)
Bucket 9 from 16, total 4 paths
R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/4 (next hop 10.0.4.2)
Bucket 8 from 16, total 4 paths
R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/3 (next hop 10.0.3.2)
Bucket 9 from 16, total 4 paths
R2# show ip cef exact-route 192.168.1.10 192.168.2.10 internal
192.168.1.10 -> 192.168.2.10 : Ethernet1/3 (next hop 10.0.3.2)
Bucket 13 from 16, total 4 path
|