bondingのARPとMII監視をNIC設定を変えずにテストする。

■以下を見る限り、MII監視とARP監視のうち、ARP監視が不可となっているbonding modeが存在する。
 「bonding mode 1」ならARP/MIIの両方が出来るので、動的な切り替えテストをしてみた。

 bondingドライバの違いについて
 http://h50146.www5.hp.com/products/software/oe/linux/mainstream/support/doc/option/nic/bonding_diff.html

 0,balance-rr,o
 1,active-backup,o
 2,balance-xor,o
 3,broadcast,o
 4,802.3ad,x
 5,balance-tlb,x
 6,balance-alb,x

■bondingのARPとMII監視をNIC設定を変えずにテストする。

 Kernelヘッダにbondingって何?って聞いてみた。
 http://d.hatena.ne.jp/labunix/20130202

■現在の設定の確認。

$ grep -A 2 "auto eth[02]" /etc/network/interfaces | grep -v "^#\|^\-"
auto eth0
allow-hotplug eth0
iface eth0 inet manual
auto eth2
allow-hotplug eth2
iface eth2 inet manual

$ grep -A 10 "auto bond0" /etc/network/interfaces | grep -v "#\|^\-"
auto bond0
iface bond0 inet static
  address 192.168.1.88
  netmask 255.255.255.0
  broadcast 192.168.1.255
        bond-slaves eth0 eth2
        bond-mode 1
        bond-miimon 2000
        bond-primary eth0

■現在の設定が正しく反映されているかの確認。
 ※「statistics」配下にエラーやコリジョンが無いこと。

$ find /sys/class/net/bond0/ -type f -print | \
  grep . `xargs` 2> /dev/null | \
  grep -v "[tr]x_.*\:0\|address\:\|broadcast\:"
/sys/class/net/bond0/uevent:INTERFACE=bond0
/sys/class/net/bond0/uevent:IFINDEX=5
/sys/class/net/bond0/addr_len:6
/sys/class/net/bond0/dev_id:0x0
/sys/class/net/bond0/iflink:5
/sys/class/net/bond0/ifindex:5
/sys/class/net/bond0/features:0x1383
/sys/class/net/bond0/type:1
/sys/class/net/bond0/link_mode:0
/sys/class/net/bond0/carrier:1
/sys/class/net/bond0/dormant:0
/sys/class/net/bond0/operstate:up
/sys/class/net/bond0/mtu:1500
/sys/class/net/bond0/flags:0x1403
/sys/class/net/bond0/statistics/rx_packets:1294
/sys/class/net/bond0/statistics/tx_packets:184
/sys/class/net/bond0/statistics/rx_bytes:91985
/sys/class/net/bond0/statistics/tx_bytes:13449
/sys/class/net/bond0/statistics/multicast:1
/sys/class/net/bond0/statistics/collisions:0
/sys/class/net/bond0/bonding/slaves:eth0 eth2
/sys/class/net/bond0/bonding/mode:active-backup 1
/sys/class/net/bond0/bonding/fail_over_mac:none 0
/sys/class/net/bond0/bonding/arp_validate:none 0
/sys/class/net/bond0/bonding/arp_interval:0
/sys/class/net/bond0/bonding/downdelay:0
/sys/class/net/bond0/bonding/updelay:0
/sys/class/net/bond0/bonding/lacp_rate:slow 0
/sys/class/net/bond0/bonding/ad_select:stable 0
/sys/class/net/bond0/bonding/xmit_hash_policy:layer2 0
/sys/class/net/bond0/bonding/num_grat_arp:1
/sys/class/net/bond0/bonding/num_unsol_na:1
/sys/class/net/bond0/bonding/miimon:2000
/sys/class/net/bond0/bonding/primary:eth0
/sys/class/net/bond0/bonding/use_carrier:1
/sys/class/net/bond0/bonding/active_slave:eth0
/sys/class/net/bond0/bonding/mii_status:up

■ARPに関する設定の一覧

$  find /sys/class/net/bond0/ -type f -name "*arp*" -print
/sys/class/net/bond0/bonding/arp_validate
/sys/class/net/bond0/bonding/arp_interval
/sys/class/net/bond0/bonding/arp_ip_target
/sys/class/net/bond0/bonding/num_grat_arp

■ARP監視に変更
 ※文字を含む場合は先頭に「+」をつけてechoする。

$ echo +192.168.1.1 | sudo tee /sys/class/net/bond0/bonding/arp_ip_target
+192.168.1.1
$ echo "2000" | sudo tee /sys/class/net/bond0/bonding/arp_interval
2000
$ find /sys/class/net/bond0/bonding/ -type f -name "[ams][lor]*" -print | grep . `xargs`
/sys/class/net/bond0/bonding/slaves:eth0 eth2
/sys/class/net/bond0/bonding/mode:active-backup 1
/sys/class/net/bond0/bonding/arp_validate:none 0
/sys/class/net/bond0/bonding/arp_interval:2000
/sys/class/net/bond0/bonding/arp_ip_target:192.168.1.1

■ARP監視設定が反映されているか

$ echo 3 | sudo tee /sys/class/net/bond0/bonding/arp_validate
$ find /sys/class/net/bond0/bonding/ -type f -name "[ams][lor]*" -print | grep . `xargs`
/sys/class/net/bond0/bonding/slaves:eth0 eth2
/sys/class/net/bond0/bonding/mode:active-backup 1
/sys/class/net/bond0/bonding/arp_validate:all 3
/sys/class/net/bond0/bonding/arp_interval:2000
/sys/class/net/bond0/bonding/arp_ip_target:192.168.1.1

■MII監視は無効になっているか(自動で行われる)

$ find /sys/class/net/bond0/bonding/ -type f -name "*mii*" | grep `xargs` | wc -l
0
$ find /sys/class/net/bond0/bonding/ -type f -name "*mii*"
/sys/class/net/bond0/bonding/miimon
/sys/class/net/bond0/bonding/mii_status

■MII監視からARP監視に変更が「/proc」にも反映されているか

$ grep "ARP\|MII\|Interface" /proc/net/bonding/bond0
MII Status: up
MII Polling Interval (ms): 0
ARP Polling Interval (ms): 2000
ARP IP target/s (n.n.n.n form): 192.168.1.1
Slave Interface: eth0
MII Status: up
Slave Interface: eth2
MII Status: up

■統計情報にエラーがカウントアップされていないか

$ grep . /sys/class/net/bond0/statistics/* | grep -v "\:0\$"
/sys/class/net/bond0/statistics/multicast:23
/sys/class/net/bond0/statistics/rx_bytes:155120
/sys/class/net/bond0/statistics/rx_packets:2225
/sys/class/net/bond0/statistics/tx_bytes:45888
/sys/class/net/bond0/statistics/tx_packets:688

■「arp_validate」のは「1(Active),2(Backup),3(Active/Backup)」という性質上、
 「Bonding Mode: fault-tolerance (active-backup)」の場合のみ。

$ grep -A 35  ^arp_validate /usr/src/linux-source-2.6.32/Documentation/networking/bonding.txt
arp_validate

        Specifies whether or not ARP probes and replies should be
        validated in the active-backup mode.  This causes the ARP
        monitor to examine the incoming ARP requests and replies, and
        only consider a slave to be up if it is receiving the
        appropriate ARP traffic.

        Possible values are:

        none or 0

                No validation is performed.  This is the default.

        active or 1

                Validation is performed only for the active slave.

        backup or 2

                Validation is performed only for backup slaves.

        all or 3

                Validation is performed for all slaves.

        For the active slave, the validation checks ARP replies to
        confirm that they were generated by an arp_ip_target.  Since
        backup slaves do not typically receive these replies, the
        validation performed for backup slaves is on the ARP request
        sent out via the active slave.  It is possible that some
        switch or network configurations may result in situations
        wherein the backup slaves do not receive the ARP requests; in
        such a situation, validation of backup slaves must be
        disabled.

■MII監視に変更

$ echo 0  | sudo tee /sys/class/net/bond0/bonding/arp_validate
0
$ echo "2000" | sudo tee /sys/class/net/bond0/bonding/miimon
2000

$ grep . /sys/class/net/bond0/bonding/mii*
/sys/class/net/bond0/bonding/mii_status:up
/sys/class/net/bond0/bonding/miimon:2000

$ grep "AARP\|MII\|Interface" /proc/net/bonding/bond0
MII Status: up
MII Polling Interval (ms): 2000
Slave Interface: eth0
MII Status: up
Slave Interface: eth2
MII Status: up

$ grep . /sys/class/net/bond0/statistics/* | grep -v "\:0\$"
/sys/class/net/bond0/statistics/multicast:31
/sys/class/net/bond0/statistics/rx_bytes:190076
/sys/class/net/bond0/statistics/rx_packets:2781
/sys/class/net/bond0/statistics/tx_bytes:63542
/sys/class/net/bond0/statistics/tx_packets:963

■MII監視のアップ/ダウンの遅延を設定
 「miimon」以上でないと「0」にリセットされる。

$ echo 200 | sudo tee /sys/class/net/bond0/bonding/updelay
200
$ echo 200 | sudo tee /sys/class/net/bond0/bonding/downdelay
200
$ grep . /sys/class/net/bond0/bonding/*delay
/sys/class/net/bond0/bonding/downdelay:0
/sys/class/net/bond0/bonding/updelay:0

■「miimon」と同じ値であればリセットされない。

$ echo 2000 | sudo tee /sys/class/net/bond0/bonding/updelay
2000
$ echo 2000 | sudo tee /sys/class/net/bond0/bonding/downdelay
2000

$ grep . /sys/class/net/bond0/bonding/[dmu][iop]*
/sys/class/net/bond0/bonding/downdelay:2000
/sys/class/net/bond0/bonding/mii_status:up
/sys/class/net/bond0/bonding/miimon:2000
/sys/class/net/bond0/bonding/mode:active-backup 1
/sys/class/net/bond0/bonding/updelay:2000

■「miimon」より大きい(監視間隔の倍数)であれば設定できる。

$ grep . /sys/class/net/bond0/bonding/[dmu][iop]*
/sys/class/net/bond0/bonding/downdelay:4000
/sys/class/net/bond0/bonding/mii_status:up
/sys/class/net/bond0/bonding/miimon:2000
/sys/class/net/bond0/bonding/mode:active-backup 1
/sys/class/net/bond0/bonding/updelay:4000

■ドキュメントからは同じ値が推奨と読み取れるが。。。

$ grep -A 8 ^downdelay /usr/src/linux-source-2.6.32/Documentation/networking/bonding.txt
downdelay

        Specifies the time, in milliseconds, to wait before disabling
        a slave after a link failure has been detected.  This option
        is only valid for the miimon link monitor.  The downdelay
        value should be a multiple of the miimon value; if not, it
        will be rounded down to the nearest multiple.  The default
        value is 0.

$ grep -A 7 "^updelay\$" /usr/src/linux-source-2.6.32/Documentation/networking/bonding.txt
updelay

        Specifies the time, in milliseconds, to wait before enabling a
        slave after a link recovery has been detected.  This option is
        only valid for the miimon link monitor.  The updelay value
        should be a multiple of the miimon value; if not, it will be
        rounded down to the nearest multiple.  The default value is 0.

■無効として0にリセットされる条件は大きく以下の3つ

 「0より小さい」
 「updelay/downdelayの値が異なる」、
 「updelay、downdelayがmiimonの値で割り切れない」

$ grep "if .*[du].*delay" /usr/src/linux-source-2.6.32/drivers/net/bonding/bond_main.c
                if (bond->params.updelay) {
                        if (ignore_updelay)
        if (bond->params.miimon && delayed_work_pending(&bond->mii_work))
        if (bond->params.arp_interval && delayed_work_pending(&bond->arp_work))
        if (updelay < 0) {
        if (downdelay < 0) {
                if (updelay || downdelay) {
                if ((updelay % miimon) != 0) {
                if ((downdelay % miimon) != 0) {

■アップ、ダウンの遅延をアベコベにする人は居ないと思うが、
 0以上かつ、miimon設定値以上でmiimon設定値の(等|n)倍数が設定できる値。
 以下のようにstatics配下のチェックは定期的に行った方がよいかも知れない。

$ grep . /sys/class/net/bond0/statistics/* | grep -v "\:0\$"
/sys/class/net/bond0/statistics/rx_bytes:149733
/sys/class/net/bond0/statistics/rx_packets:1022
/sys/class/net/bond0/statistics/tx_bytes:27772
/sys/class/net/bond0/statistics/tx_packets:469