Network binding

Yunkyu Seong

merius@merius.net

 

1.    Network binding

A.     IP routing table : local에서 network로 나가는 packet에 대해, destination IP에 따라 어떤 NIC device를 이용할지 결정한다. , 해당 destination IP에 대해서 2개이상의 NIC를 사용하도록 설정한 경우 한가지 rule만 적용된다. , 특정 destination IP에는 하나의 NIC만 사용할 수 있게 된다.

B.      ARP : destination IP address physical network address로 대응시키기 위해 사용되는 protocol이다. 예를 들어 ‘A’에서 ‘B’에게 IP packet을 전송하고자 할 때 ‘B’ physical network address를 모르는 경우, 네트워크상에 ‘B’ physical network address를 묻는 ARP query broadcast한다. 이때, ‘B’는 이 ARP packet을 받으면 자신의 physical network address‘A’에게 응답한다. (http://terms.co.kr/ARP.htm 참조)

OS에서는 ARP로 받은 physical network address caching한다. 따라서, network binding을 하기 위해서는 이 ARP cache를 삭제하고, 특정 destination IP를 사용하고 있는 NIC MAC address를 직접 등록하도록 한다. 또한 각 NIC이 직접 ARP 대답을 보낼 수 있게 하도록 각 NICARP filter를 설정해야 한다.

C.      Core binding of NIC IRQ handler : 특정 device IRQ handler core affinity를 설정하는 것으로, 특정 core IRQ event를 처리하도록 하는 것이 가능하다. Network binding을 할 때는, 여러개의 NIC IRQ handler를 각자 특정 core affinity를 주도록 한다.

2.    Things you have to do

* Super user authorization required

A.     Stop IRQ balancer

#> /etc/init.d/irq_balancer stop

#>

 

B.      Set a CPU core affinity for IRQ of each NIC

#> # find a IRQ number for each NIC

#> cat /proc/interrupt

#>

#> # set CPU core affinity for each NIC

#> # example

#> echo ‘00000000,00000000,00000000,00000001’ >  /proc/irq/<IRQ>/smp_affinity

 

#>

l  /proc/interrupt의 정보를 통해 각 NIC가 사용하는 IRQ 번호를 알수 있다.

l  smp_affinity값은 2 core번호승 값으로 정한다.

n  example

0 core: ‘00000000,00000000,00000000,00000001’

1 core: ‘00000000,00000000,00000000,00000002’

2 core: ‘00000000,00000000,00000000,00000004’

3 core: ‘00000000,00000000,00000000,00000008’

l  L2 shared core, socket shared core 찾기

n  SuSe10 기준: 아래 첫번째 명령을 통해 L2 cache를 공유하는 core를 찾고, 두번째 명령어를 통해 같은 socket을 사용하는 core를 찾는다. 읽는 방법은 위 smp_affinity와 같다.

#> cat /sys/devices/system/cpu/cpu<core#>/cache/index2/shared_cpu_map

#> cat /sys/devices/system/cpu/cpu<core#>/topology/physical_package_id

#>

 

n  SuSE9 기준: 읽는 방법은 smp_affinity 동일

#> cat /sys/devices/system/node/node<node#>/cpumap

#>

 

C.      Adjust IP routing table

#> /sbin/route del <client IP address>

#> /sbin/route add <client IP address> dev <NIC>

#>

 

D.     Enable ARP filter

#> for f in /proc/sys/net/ipv4/conf/*/arp_filter; do

echo 1 > $f

done

#>

 

E.      Flush ARP cache & adjust ARP cache manually

#> /sbin/arp –I <NIC> -d <client IP address>

#> /sbin/arp –s <client IP address> <client MAC address>

#>

 

3.    Example

Server 4개의 NIC를 가지고, 2개의 client가 각각 2개의 NIC를 가지고 있을 때, server NIC client NIC 1:1 binding을 하고자 한다. 이때 다음과 같이 설정한다.

A.     Network Environment

                         i.         Server

1.      eth0 : 192.168.0.10, 00:11:AA:BB:00

2.      eth1 : 192.168.0.11, 00:11:AA:BB:01

3.      eth2 : 192.168.0.12, 00:11:AA:BB:02

4.      eth3 : 192.168.0.13, 00:11:AA:BB:03

                        ii.         Client_A

1.      eth0 : 192.168.0.20, 00:22:CC:DD:00

2.      eth1 : 192.168.0.21, 00:22:CC:DD:01

                       iii.         Client_B

1.      eth0 : 192.168.0.30, 00:33:EE:FF:00

2.      eth1 : 192.168.0.31, 00:33:EE:FF:01

 

B.      Server side

                         i.         Adjust IP routing table

#> # IP routing table clear

#> /sbin/route del 192.168.0.20

#> /sbin/route del 192.168.0.21

#> /sbin/route del 192.168.0.30

#> /sbin/route del 192.168.0.31

#>

#> # IP routing table setting

#> /sbin/route add 192.168.0.20 eth0

#> /sbin/route add 192.168.0.21 eth1

#> /sbin/route add 192.168.0.30 eth2

#> /sbin/route add 192.168.0.31 eth3

#>

 

 

                        ii.         Enable ARP filter

#> # enable ARP filter

#> for f in /proc/sys/net/ipv4/conf/*/arp_filter; do

echo 1 > $f

done

#>

 

                       iii.         Adjust ARP cache

#> # ARP cache flushing

#> /sbin/arp –i eth0 –d 192.168.0.20

#> /sbin/arp –i eth1 -d 192.168.0.21

#> /sbin/arp –i eth2 –d 192.168.0.30

#> /sbin/arp –i eth3 –d 192.168.0.31

#> # ARP cache setting

#> /sbin/arp –s 192.168.0.20 00:22:CC:DD:00 –i eth0

#> /sbin/arp –s 192.168.0.21 00:22:CC:DD:01 –i eth1

#> /sbin/arp –s 192.168.0.30 00:33:EE:FF:00 –i eth2

#> /sbin/arp –s 192.168.0.31 00:33:EE:FF:01 –i eth3

#>

 

                       iv.         Check a configured

1.      IP routing table check

아래 명령어를 통해 routing table 상태를 확인할 수 있다.

#> /sbin/route –n

#>

 

2.      ARP cache list check

아래 명령어를 통해 ARP cache를 확인 할 수 있다. 이때, 직접 설정한 부분에서는 ‘Flags Mask’‘CM’으로 나타나며 이외는 ‘C’로 나타난다. , ARP의 경우 cache이기 때문에 삭제 명령을 내리더라도 곧장 삭제되지 않고 얼마간의 시간이 지난 후에 삭제되기도 한다.

#> /sbin/arp –n

#>

 

3.      ARP reply check

아래 명령어를 통해 실제 ARP request에 대해 ARP result를 확인할 수 있다. 이때 대답이 설정한 MAC address와 동일한지 확인 한다.

#> /sbin/arping -c <times> <destination IP> -I <NIC>

#>

                    

C.      Client_A

                         i.         Adjust IP routing table

#> # IP routing table clear

#> /sbin/route del 192.168.0.10

#> /sbin/route del 192.168.0.11

#>

#> # IP routing table setting

#> /sbin/route add 192.168.0.10 eth0

#> /sbin/route add 192.168.0.11 eth1

#>

 

 

                        ii.         Enable ARP filter

#> # enable ARP filter

#> for f in /proc/sys/net/ipv4/conf/*/arp_filter; do

echo 1 > $f

done

#>

 

                       iii.         Adjust ARP cache

#> # ARP cache flushing

#> /sbin/arp –i eth0 –d 192.168.0.10

#> /sbin/arp –i eth1 -d 192.168.0.11

#> # ARP cache setting

#> /sbin/arp –s 192.168.0.10 00:11:AA:BB:00 –i eth0

#> /sbin/arp –s 192.168.0.11 00:11:AA:BB:01 –i eth1

#>

 

D.     Client_B

                         i.         Adjust IP routing table

#> # IP routing table clear

#> /sbin/route del 192.168.0.12

#> /sbin/route del 192.168.0.13

#>

#> # IP routing table setting

#> /sbin/route add 192.168.0.12 eth0

#> /sbin/route add 192.168.0.13 eth1

#>

 

 

                        ii.         Enable ARP filter

#> # enable ARP filter

#> for f in /proc/sys/net/ipv4/conf/*/arp_filter; do

echo 1 > $f

done

#>

 

                       iii.         Adjust ARP cache

#> # ARP cache flushing

#> /sbin/arp –i eth0 –d 192.168.0.12

#> /sbin/arp –i eth1 -d 192.168.0.13

#> # ARP cache setting

#> /sbin/arp –s 192.168.0.12 00:11:AA:BB:02 –i eth0

#> /sbin/arp –s 192.168.0.13 00:11:AA:BB:03 –i eth1

#>