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 대답을 보낼 수 있게 하도록 각 NIC의 ARP 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 #> |