[레드헷] Bonding 구성시 RX패킷의 로드밸런싱이 이뤄지지 않습니다.

자일자일의 이미지

NIC두개를(eth0, eth1) 이용하여 bond0 구성후, ftp를 통하여 서버 > 클라이언트 전송 1회
클라이언트 < 서버 전송 1회 테스트를 해봤습니다.

이후, ifconfig 를 통해 RX, TX패킷을 확인해보니 bond0 에서 수신한 패킷의 대부분은(거의 모든 트래픽) eth0에서
수신을 하였고, TX 전송 패킷을 확인햅니 eth0, eth1 각각 절반을 나눠서 전송하였습니다.

즉, bond0을 eth0 eth1 을 이용하여 구성하였으나, RX 수신패킷은 로드밸런싱이 되지 않고, TX 송신패킷만 로드밸런싱이
되고있습니다. 문제가 무엇인지 알고 싶습니다.

[root@log-ser-03 ~]# ifconfig
bond0 Link encap:Ethernet HWaddr 00:0C:29:9C:10:28
inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
UP BROADCAST RUNNING MASTER MULTICAST MTU:1500 Metric:1
RX packets:892361 errors:0 dropped:0 overruns:0 frame:0
TX packets:775984 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:647398942 (617.4 MiB) TX bytes:1040260515 (992.0 MiB)

eth0 Link encap:Ethernet HWaddr 00:0C:29:9C:10:28
inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe9c:1028/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:892331 errors:0 dropped:0 overruns:0 frame:0
TX packets:387992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:647395986 (617.4 MiB) TX bytes:520159583 (496.0 MiB)
Interrupt:10 Base address:0x2024

eth1 Link encap:Ethernet HWaddr 00:0C:29:9C:10:28
inet addr:192.168.0.103 Bcast:192.168.0.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe9c:1028/64 Scope:Link
UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1
RX packets:30 errors:0 dropped:0 overruns:0 frame:0
TX packets:387992 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2956 (2.8 KiB) TX bytes:520100932 (496.0 MiB)
Interrupt:9 Base address:0x20a4

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:2231 errors:0 dropped:0 overruns:0 frame:0
TX packets:2231 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2709854 (2.5 MiB) TX bytes:2709854 (2.5 MiB)

----------------------------------------------------------------------------------------------------------------

이하 내용은 vmware 가상 서버의 설정이나, HP 블레이드에도 bonding 구성후 사용중이나 동일한 증상을 겪고
있습니다.

[root@log-ser-03 ~]# uname -a
Linux log-ser-03 2.6.9-5.EL #1 Wed Jan 5 19:22:18 EST 2005 i686 i686 i386 GNU/Linux

----------------------------------------------------------------------------------------------------------------

# cd /etc/sysconfig/network-scripts/ifcfg-bond0
DEVICE=bond0
BOOTPROTO=none
BROADCAST=192.168.0.255
IPADDR=192.168.0.103
NETMASK=255.255.255.0
NETWORK=192.168.0.0
ONBOOT=yes
USERCTL=no

----------------------------------------------------------------------------------------------------------------

# cd /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

----------------------------------------------------------------------------------------------------------------

# cd /etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none

----------------------------------------------------------------------------------------------------------------

# cd /etc/modules.conf
alias bond0 bonding
options bond0 miimon=100 mode=1 use_carrier=0

alias eth0 vmnics
alias eth1 vmnics
alias scsi_hostadapter mptbase
alias scsi_hostadapter1 mptscsih
alias usb-controller ehci-hcd
alias usb-controller1 uhci-hcd
# Added by VMware Tools
install pcnet32 /sbin/modprobe -q --ignore-install vmxnet;/sbin/modprobe -q --ignore-install pcnet32 $CMDLINE_OPTS;/bin/true
alias char-major-14 sb
options sb io=0x220 irq=5 dma=1 dma16=5 mpu_io=0x330

----------------------------------------------------------------------------------------------------------------

# cd /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=log-ser-03
GATEWAYDEV=bond0
GATEWAY=192.168.0.1

자일자일의 이미지

mode 설정의 문제입니까?

module options
mode
0 : round-robin 방식의 load-balance, fault-tolerance
송수신이 차례대로 인터페이스를 번갈아 사용한다.
1 : active-standby 방식
2 : XOR 방식의 load-balance, fault-tolerance
수신 시에는 MAC address를 통한 매핑을 사용하고
전송 시에는 첫 인터페이스 사용
3 : broadcast 방식의 load-balance, fault-tolerance
모든 slave 인터페이스에 전송

현재 mode '1'을 사용중인데, eth0이 failover되지 않아 eth1의 rx가 없는것이라면
tx수신은 절반식 이뤄지는것이 이해가 되지 않습니다.

ggeagle의 이미지

답변이 없어서... 단순히 추측으로만 말씀드립니다.

다음의 원리를 잘 따져 보시면


  • 데이타를 보낼 때 : 이더넷 프레임 중 앞에 붙는 동기신호용 비트와 끝에 붙는 에러검출용을 제외한 모든 이더넷 프레임은 커널이 생성한 것이다.즉 데이타를 보낼 때는 커널이 맥어드레스를 적어넣는다.
  • 데이타를 받을 때 : 랜카드가 자신의 바이어스상 심어진 맥어드레스주소와 일치하거나,이더넷 멀티캐스트이거나,이더넷 브로드캐스트이거나 할 때 수신처리하고 기타의 목적지주소일 때는 드랍된다.(promiscuous 일 때는 고려하지 않음)

이상의 원리에 따르면 데이타를 보낼 때 커널이 출발지 맥어드레스를 어떤 것으로 채워넣느냐에 따라 상대방은 그 주소를
목적지 맥어드레스로 응답할 것이기 때문에 동작이 결정됩니다.

다음 링크의 문서를 보시면 본딩의 4가지 모드가 설명되어 있는데
http://www.knom.or.kr/knom-review/v8n1/8.pdf

4번 모드가 동작하는 원리는 위와 같은 것입니다.(님이 원하시는게 4번입니다.)
랜카드의 바이어스에 심어진 맥어드레스는 커널에서 수정되지 않기 때문에 어떤 랜카드로 받을까를 결정하는 방법은 어떤 랜카드의 맥어드레스를 출발지 맥어드레스로 커널이 써 넣어보내느냐에 따라 작동합니다.

컴퓨터 없이도 컴퓨터를 배울 수 있을까? 8년째!

=========================

매일막걸리 한 병 = 상태메롱

자일자일의 이미지

먼저, 답변감사합니다.

첨부해주신 PDF파일은 잘 보았습니다.
헌데 제가 궁금한사항과는 조금 어긋나는듯싶습니다.

저의 문제는 데이터 100메가를 band0으로 전송시(TX) 구성된 eth0 eth1로 각각 50MB/50MB를 나눠서(로드밸런싱)해서
제가 원하는바를 충족시켜주느데

데이터 수신시 모든 데이터를 eth0이 처리하게됩니다.
("데이타를 받을 때 : 랜카드가 자신의 바이어스상 심어진 맥어드레스주소와 일치하거나,이더넷 멀티캐스트이거나,이더넷 브로드캐스트이거나 할 때 수신처리하고 기타의 목적지주소일 때는 드랍된다.(promiscuous 일 때는 고려하지 않음)" 제가 이부분을
이해하지 못하여 그런것인가요 ?

헌데, bonding 구성시 구성된 장치들의 MAC는 모두 같아지는것이 정상인가요 ?
제가 각기 다른 두개의 시스템으로 본딩을 해보았는데 (hp blade & vmware)

eth0, eth1 을 bond0 으로 묶고나면
eth0의 MAC 주소를 bond0과 eth1에 줘버리더군요.
HWADDR=00:0C:29:9C:10:28 이런식으로 eth1에 수동으로 지정을해주면 bonding 구성이 되지않네요.

이렇다면 MAC주소의 문제가 아닌듯도 싶고...

김정균의 이미지

서버 상단의 스위치는 어떻게 구성이 되어 있나요? 두 회선이 다른 routing 경로를 가지고 있는 것이 아닌가요?

만약 동일한 routing path 를 가지고 있는 경우라면, 아마 상단 switch 쪽에서 두 포트를 묶어 주시면 아마 밸런싱이 될 겁니다. 똑똑한 스위치의 경우에는 포트를 묶어주지 않을 경우 두 포트에서 동일 맥이 올라오는 경우 하나를 차단 하거나 둘다 차단하는 경우가 있을 수 있습니다. 멍청한 스위치는 그냥 둘다 사용을 하더군요 ^^;

Cisco 45xx 시리즈의 경우에는 (2년전 경험이라서..) 포트를 내리거나 하지는 않는데, 동일 맥이 올라온다고 무지하게 불평을 로그에 남겨 놓아서 스위치 성능을 떨어뜨리더군요.

자일자일의 이미지

제가 현재 사용하는 서버들의 회선은 같은 스위치에 물려나오고
같은 라우팅정보를 가지고 있습니다.

일단, 다른 업체의 서버에 접속할 수 있는 기회를 얻어 도움을 좀
받아봐야겠습니다.

확인후 글 달도록 하겠습니다.

frenzy의 이미지

오래된 제 기억에 의하면 스위치에서 etherchannel 설정을 해야 하는 것으로 기억합니다.
+
++++++++++++++++++++++++++++++++++++++++++++++
혼자놀기의 도사가 되리라... http://geeklife.co.kr

.
++++++++++++++++++++++++++++++++++++++++++++++
혼자놀기의 도사가 되리라... http://geeklife.co.kr

ggeagle의 이미지

먼저 제가 직접 테스트해볼 수 없는 처지라 이론적으로만 말씀드림을 고려해 주십시요.
원리적으로는 만약 스위치에서 맥어드레스 스푸핑과 같은 것을 탐지하도록 설정되지 않았다면 스위치의 채널본딩과는
별개의 문제일 것입니다.넷트웍장치의 본딩이 시스코에서 먼저 시작되었다고 하니 어떤식으로 연관이 있을지는 모르지만
리눅스 시스템의 본딩이 스위치에서 본딩이 되어야 정상동작한다는 것은 아닌 듯 합니다.

질문을 인용해 보면
---------------------------------------------------------------------------
헌데, bonding 구성시 구성된 장치들의 MAC는 모두 같아지는것이 정상인가요 ?
제가 각기 다른 두개의 시스템으로 본딩을 해보았는데 (hp blade & vmware)

eth0, eth1 을 bond0 으로 묶고나면
eth0의 MAC 주소를 bond0과 eth1에 줘버리더군요.
HWADDR=00:0C:29:9C:10:28 이런식으로 eth1에 수동으로 지정을해주면 bonding 구성이 되지않네요.

이렇다면 MAC주소의 문제가 아닌듯도 싶고...
---------------------------------------------------------------------------

  • 맥어드레스는 2가지 종류가 있습니다.
    1. 랜카드 프로세서 제조회사별로 RFC 1700 에 의해 IANA 에서 할당되어 바이어스에 심어진 것
    2. 이 정보가 시스템이 부팅되고 커널에 포함된 랜카드 드라이버에 의해 성공적으로 인식되었을 때 시스템의 주메모리에 복사된 것.
    첫번째것은 롬라이터등의 특별한 방법을 통하지 않고는 변경되지 않습니다. 두번째 것은 ifconfig 등의 프로그램을 통해 볼 수도 있고 수정할 수도 있는 것으로....
  • 앞서 답변이 좀 부실했나 봅니다.다른말로 설명드리면 데이타를 보낼 때는 커널이 sk_buff 구조체형식으로 프레임을 만드는데 이 때 발신지 맥어드레스는 비록 OSI-2 계층의 프레임이지만(즉 TCP/IP의 물리 프레임이지만)랜카드가 만드는 것이 아니고 커널이 만듭니다.이 프레임을 만들 때 메모리에 있는 맥어드레스를 이용하지요.즉 앞서의 두번째 맥어드레스를 이용해 프레임을 만들게 되므로 맥어드레스 변경 유틸리티를 이용해 변경하게 되면 시스템에서 나가는 프레임은 이 변경된 맥어드레스를 출발지맥으로 갖는 맥스푸핑이 일어납니다.많은 넷트웍문서에서 물리계층의 프레임은 장치가 생성하는 것으로 설명되어 있는데 이는 일부 틀린내용입니다.
  • 그럼 데이타를 받을 때는 데이타는 맨 처음에 커널이 관여하기 전에 넷트웍장치의 버퍼에 저장됩니다.이 때 에러체크도 하고 이더넷 프레임헤더를 검사해서 목적지 맥어드레스를 체크합니다.여기서 3가지의 일치가 될 때 장치는 커널로 전송하게 되는데(엄밀하게는 장치가 직접 응답할 경우도 있겠지만)
    1. 목적지 맥 = 자신의 바이어스에 심어진 맥
    2. 멀티캐스트
    3. 브로드캐스트 = FFFFFF
    이 일치가 하나도 없을 때 장치가 promiscuous 모드가 아니라면 드랍됩니다.

리눅스에서 보낼 때 eth0와 eth1을 절반정도 이용하면서 번갈아 보내는 것은 기술적으로도 쉽고 간단하게 추측할 수 있습니다.하지만 받을 때는 위의 원리를 철저하게 이해하셨다면 받을 때는 절대로 '리눅스가 결정할 수 있는 것이 아무것도 없기 때문에'
보낼 때 받을 맥어드레스까지 변경시켜줘야 한다는 결론에 다다르게 됩니다.
본딩에 얽매이지 말고 다음을 상상해 봅시다.

스위치에 시스템 A 와 B 가 연결되어 있을 때 A가 네이버에 데이타를 보내면서 네이버로부터 오는 응답은 B로 받고싶다고 할 때 제일먼저 상상할 수 있는 것이 IP 또는 맥어드레스 스푸핑입니다.
실제로 이렇게 조작을 하게 되면 나가는 패킷에 대해 출발지 어드레스조작을 검사하지 않는(검사하지 않는 것이 기본이죠)대부분의 통신에서는 스위치의 어떤 설정과 무관하게 넷트웍이론상 통신의 방향전환이 가능합니다.
악의적으로 쓰이게 되면 해킹이고 채널본딩과 같은식으로 쓰이게 되면 이런 이론이 도움이 되는 것이죠.....

다시 리눅스로 돌아와 보면 리눅스의 커널은 eth0 만으로 보내든 eth1 만으로 보내든 둘 다 반반씩 보내든 매번 보내는 패킷 MTU 마다 출발지 맥어드레스를 eth0 한번 eth1 한번 이런씩으로 균등하게 조작하는 작용을 해 주게 되면 됩니다.
===>리눅스의 본딩이 어느정도까지 되는지 저는 모릅니다. 다만 본딩의 개념과 넷트웍이론만으로 이는 충분히 완전한 그림이
될 수 있다는 것만 설명드리고자 합니다.
다만 앞서도 말씀드렸듯 출발지 맥어드레스 조작을 체크하는 장비나 방화벽소프트웨어가 있을 경우 이는 동작하지 않을 것입니다.

컴퓨터 없이도 컴퓨터를 배울 수 있을까? 8년째!

=========================

매일막걸리 한 병 = 상태메롱

자일자일의 이미지

답변을 참고하여 공부하도록 하겠습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.