2012년 3월 1일 목요일

점보프레임(Jumbo Frame)으로 전송속도 높이기

점보프레임(Jumbo Frame)을 소개해 볼까 한다. 기본적으로 우리가 지금 사용하는 MTU(Maximum Transmission Unit) 값은 1500 바이트이다. 실제 전송시에는 여기에 프레임 헤더를 붙이면 18 바이트가 추가되어 기본적으로는 1518 바이트가 된다. 점보프레임은 이름에서 느껴지는 것과 같이 프레임 크기를 크게 늘려주는 것이다. 점보프레임은 9000 바이트까지 MTU 를 확장시켜 준다. 처음 이더넷 프레임으로 1500 바이트가 사용된 것은 과거 낮은 통신속도와 비교적 높게 발생되었던 에러 비율 때문에 그런것이다. 즉, 데이터를 전송하다가 에러가 발생되면 단지 1500 바이트 부분만 에러를 정정하여 재 전송하면 되는 것이었다.

하지만 각 프레임은 네트워크 하드웨어와 소프트웨어적으로 프로세싱하는 것이 필요하다. 만약 프레임 사이즈가 커진다면 시스템에서 전송하기 위해 사용되는 처리 CPU 가 더 줄어든다. 그러므로 9000 바이트 이상으로 커진다면 데이터를 자르는 기준이 적어지므로 더욱 빠른 속도로 전달될 수 있는 것이다. 한번에 1500 바이트가 아닌 9000 바이트를 전송하기 때문이다.

그렇지만, 요새 하드웨어 성능은 워낙 좋아졌기 때문에 점보프레임으로 인한 성능 향상은 그리 크지는 않을 수 있다. 점보프레임이 2000년대 초 소개되었을 당시는 어느 정도 효과를 볼 수 있었을지 몰라도 빠르게 발전하는 하드웨어 속도에 비하면 프레임을 나누기 위한 CPU 사용은 적기 때문이다. 그래도 모든 사람이 좋은 하드웨어를 사용하는 것은 아니기 때문에 어느정도 효과는 있을 수 있다. 경험상 10-20% 정도의 향상을 얘기하는 경우가 많다.

점보프레임을 사용하기 위해서는 스위치, NIC 카드등에서 지원해야 하며, 요즘 사용되는 장비들은 대부분 지원한다. 다음 그림은 점보프레임이 설정된 패킷을 덤프한 것으로 데이터 크기가 8920 바이트나 되는 것을 확인할 수 있다.



시스템상에서의 설정은 MTU 값을 변경해 주는 것으로 간단하다. 다음과 같이 확인해 볼 수 있는데, 다음과 같이 설정전에는 MTU 가 1500 인 것을 볼 수 있다. (리눅스의 경우 커널 2.6.17 이상이면 지원된다)

# ip route get 111.6.0.25
111.6.0.25 dev bond1  src 111.6.0.30
    cache  mtu 1500 advmss 1460 hoplimit 64

ifconfig 로도 확인해 볼 수 있다.

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:78501442 errors:0 dropped:0 overruns:0 frame:0
          TX packets:29641408 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:34935770805 (32.5 GiB)  TX bytes:25180384472 (23.4 GiB)
          Interrupt:48 Memory:d6000000-d6012800

해당 인터페이스의 MTU 를 다음과 같이 설정해 준다.

# ifconfig eth6 mtu 9000
# ifconfig eth6

eth6      Link encap:Ethernet  HWaddr [삭제]
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:9000  Metric:1
          RX packets:2892 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2728 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:256450 (250.4 KiB)  TX bytes:2785780 (2.6 MiB)
          Interrupt:32 Memory:d8000000-d8012800

다시 ip 명령어로 확인해 보면 9000 바이트임을 확인할 수 있다.

# ip route get 111.6.0.25
111.6.0.25 dev bond1  src 111.6.0.30
    cache  mtu 9000 advmss 8960 hoplimit 64

tcpdump 로 트래픽을 캡쳐할 때도 캡쳐 크기를 늘려줘야 되므로 -s 로 9000 바이트를 지정해 주어야 한다.

# tcpdump -i bond1 -s 9000 -n -w jumbo.pcap
tcpdump: listening on bond1, link-type EN10MB (Ethernet), capture size 9000 bytes

다음은 tshark 로 프레임 크기를 살펴본 것으로, 1500 바이트 이상의 크기가 많이 보이는 것을 확인 할 수 있다.

# tshark -i bond1 -e frame.len -Tfields
9014
9014
66
9014
9014
66
9014
430
66
114
4210
66
114
9014
7550
66
114
114
66
4210
9014
66
9014
9014
66
6038
114
9014
^C1947 packets captured

자동으로 설정하기 위해서는  /etc/network/interfaces 에서 MTU=9000 으로 지정해 주면 된다. 그리고 재시작 해 주면 된다.

# /etc/init.d/networking restart

위 경우는 우분투, 데비안의 경우고 CentOS, 레드햇 계열은

# vi /etc/sysconfig/network-script/ifcfg-eth0

를 수정해 주면 된다.

참고로 호환성에 문제가 있을 수 있으므로 상황에 따라 판단하여 사용해야 한다.

[참고]
1. 위키피디아 점보프레임
http://en.wikipedia.org/wiki/Jumbo_frame

댓글 4개:

  1. 음 점보프레임이라는 것은 생소한 거였는데 이 글 보고 알게 이제야 알게됐네요 ㅎ

    좋은 정보 감사합니다 ^^

    답글삭제
  2. 중간에 네트워크 장비에서 MTU 설정이 동일하게 설정되지 않으면 무의미한 거겠죠?

    답글삭제