레이블이 ethtool인 게시물을 표시합니다. 모든 게시물 표시
레이블이 ethtool인 게시물을 표시합니다. 모든 게시물 표시

2013년 2월 26일 화요일

패킷사이즈가 MTU 1500 바이트를 넘는 경우는 ?

저번 포스팅에서 MTU 에 대해서 설명을 드렸습니다. 그런데 가끔 패킷 덤프를 하다보면 MTU 이상의 패킷 사이즈를 보는 경우가 있습니다. 이건 무엇이지 하고 의아해할 수 있는 것이죠. 이를 설명드리기 위해 패킷 전송과 관련한 이야기를 조금 더 해볼께요.

10G 네트워크 링크를 사용하는 경우 1500 바이트 MTU 로 계산하면 대략 초당 800,000 가까이 됩니다. 이것은 결국 패킷처리를 위해 CPU 오버헤드를 가져올 수 있게 됩니다. 이런 오버헤드를 줄이기 위해 MTU 를 늘리면 될것 같습니다. 자 점보프레임인 9000 바이트로 늘리면 한번에 더 큰 패킷을 처리할 수 있습니다. 그런데 문제는 인터넷에 연결되어 있는 모든 구간이 이 MTU 값을 사용하지 않는다는데 있습니다. 보통의 경우는 1500 바이트 이내일 것이죠. 내부 네트워크라면 모르지만 인터넷 구간에서는 현실적으로 사용이 힘들어집니다.

그래서 네트워크 어뎁터에서 채용하기 시작한 것이 TCP 세그먼테이션 오프로드 기능입니다. TSO 로도 불리기도 하죠. TSO 호환 가능 어뎁터는 커널상에서 아웃바운드 데이터에 대해 보다 큰 패킷데이터를 처리할 수 있습니다. 즉, 밖으로 패킷을 보낼때 데이터를 재-세그먼트 하여 작게 보내게 된다는 것이죠. 이것은 호스트 컴퓨터의 CPU 자원 사용면에서도 효율적이게 됩니다. TSO 외 GSO(Generic segmentation offload)도 있습니다. GSO 는 TCP 에만 한정을 두지 않는다는 장점이 있지만 데이터 전송에서만 동작하고 받는쪽에서는 동작하지 않습니다. 이 부분에 대한 솔루션 형태의 하나로 LRO(Large Receive Offload) 가 있습니다. 들어오는 패킷에 대해 한번에 Merge 를 하게 되는 것입니다. 리눅스 기반의 10G 드라이버들이 이 LRO 를 넓게 채용하고 있기도 합니다.

이전 포스팅에서도 이 오프로드에 대해서 언급한 적이 있는데 좀더 궁금하신 분들은 다음 글을 참고하시기 바랍니다.

TOE(TCP offload engine)란 무엇인가?



자, 오프로드를 언급했는데 바로 오늘 제가 여러분들에게 설명드릴 MTU 이상의 크기가 이것과 연관되어 있습니다. 다음과 같이 ethtool 을 통해 네트워크 인터페이스의 정보를 확인해 보겠습니다.


# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: off
scatter-gather: off
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off

generic-receive-offload 가 on 되어 있는 것이 보입니다. 오프로드 기능이 동작하여 패킷을 덤프할 시에 패킷의 사이즈가 다르게 보였던 것입니다. 아래 그림을 한번 보시죠.

GRO 기능이 On 되어 있는 경우는 그림과 같이 패킷 사이즈가 2762, 4017, 3538 과 같이 MTU 값 이상으로 크게 나타납니다.

[그림] GRO 기능 On

그러나 gro 기능을 off 하고 패킷 캡쳐를 다시 해보면 패킷 데이터 전송크기가  1414로 동일하게 나타납니다.


# ethtool -K eth0 gro off
# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: off
scatter-gather: off
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off


[그림] GRO 기능 off


네트워크 어뎁터에서 처리해 주었기 때문에, 패킷 캡쳐 프로그램에서는 크기가 큰 패킷 사이즈를 볼 수 있었던 것입니다.

MTU 보다 패킷 크기가 크게 나왔던 이유가 바로 오프로드 기능이 있었던 것이었죠.
좀더 많은 내용은 다음 '참고'를 확인해 보세요.

[참고]

1. 점보프레임(Jumbo Frame)으로 전송속도 높이기
http://www.packetinside.com/2012/03/jumbo-frame.html
2. Ethtool 을 통해 네트워크 카드(NIC) 정보 확인 또는 설정하기
http://www.packetinside.com/2012/04/ethtool-nic.html
3. 윈도우에서 네트워크 드라이버 설정 정보 보기 (TOE, 점보프레임등 확인)
http://www.packetinside.com/2012/05/toe.html
4. 패킷 전송 크기를 지정하는 MTU(Maximum Transmission Unit)를 알아봅시다!
http://www.packetinside.com/2013/02/mtumaximum-transmission-unit.html

2012년 4월 20일 금요일

Ethtool 을 통해 네트워크 카드(NIC) 정보 확인 또는 설정하기

패킷과 밀접한 관련이 있는 것이 네트워크 이더넷 카드이다. 오늘은 이더넷 디바이스에 대한 정보를 살펴볼까 한다. 네트워크 디바이스 드라이버와 하드웨어 셋팅을 보거나 설정할 수 있는 'ethtool' 을 통해서 말이다.
우리가 흔히 이더넷 정보를 확인할 때 대표적인 도구가 ifconfig 다. ifconfig 를 통해 링크상태, IP 주소, 맥 주소, 통신 상태 현황등을 살펴볼 수 있다. ethtool 은 이보다 더 많은 부분을 살펴볼 수 있고, 설정도 가능하다.

기본적으로 사용방법은

ethtool [옵션] [ethX] [파라미터]  와 같이 사용할 수 있다.

다음은 기본 정보를 살펴본 것으로 지원되는 링크 모드와 속도, Duplex 상태 등이 나온다.

[이미지 출처] 구글 이미지 (검색어: ethernet card)

# ethtool eth0
Settings for eth0:
 Supported ports: [ TP ]
 Supported link modes:   10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
 Supports auto-negotiation: Yes
 Advertised link modes:  10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Full
 Advertised pause frame use: No
 Advertised auto-negotiation: Yes
 Speed: 1000Mb/s
 Duplex: Full
 Port: Twisted Pair
 PHYAD: 0
 Transceiver: internal
 Auto-negotiation: on
 MDI-X: Unknown
 Supports Wake-on: umbg
 Wake-on: d
 Current message level: 0x00000007 (7)
          drv probe link
 Link detected: yes
일목요연하게 이더넷 인터페이스에 대한 정보를 한눈에 보여준다. 자, 그럼 몇 가지 주요 옵션들에 대해서 알아보도록 하겠다. -s 옵션은 속도, Duplex 등의 값을 변경할 수 있다. 아래 예는 Auto-negotiation 기능을 Off 하는 것이다.

# ethtool -s eth0 autoneg off
이외 다음과 같은 옵션들이 있으니 설정에 참고하면 된다.

ethtool -s ethX speed N [duplex half|full] [port tp|aui|bnc|mii]
              [autoneg on|off] [advertise N] [phyad N] [xcvr internal|external]
              [wol p|u|m|b|a|g|s|d...]  [sopass xx:yy:zz:aa:bb:cc] [msglvl N |
              msglvl type on|off ...]

그럼 위 예를 참고하여 Speed 및 Duplex 를 조정하기 위해서는 다음과 같이 사용하면 된다:

# ethtool -s eth0 autoneg off speed 100 duplex half

참고로 e1000 드라이버를 사용하고 있는데, 설정이 제대로 반영되지 않았다. 이것은 드라이버의 특성이 있는것 같고 자세히 살펴보지는 않았지만 드라이버의 일부 패치가 필요할 것 같다. 다른 컴퓨터에서 사용하고 있는 r8169 드라이버에서는 변경이 잘 이뤄졌다. 사용하는 네트워크 인터페이스에 따라 차이가 있을 수 있으므로 이점은 참고하길 바란다.

ethtool 외에 modprobe 로 e1000 드라이버에 대한 옵션을 아래와 같은 형태로 설정할 수 가 있다.

modprobe e1000 [<option>=<VAL1>,<VAL2>,...]

다음은 Duplex 를 0 으로 설정한 예이다. 
# modprobe e1000 Duplex=0  (0=auto-negotiate, 1=half, 2=full)
본인이 사용하는 하드웨어가 각자 다르기 때문에 적절한 방법으로 사용하면 될 것이다.

다음은 r8169 를 사용하는 곳에서 변경을 해 본 것이다.


# ethtool -s eth0 autoneg off speed 100 duplex half
# ethtool eth0
Settings for eth0:
 Supported ports: [ TP MII ]
 Supported link modes:   10baseT/Half 10baseT/Full
                         100baseT/Half 100baseT/Full
                         1000baseT/Half 1000baseT/Full
 Supports auto-negotiation: Yes
 Advertised link modes:  Not reported
 Advertised pause frame use: No
 Advertised auto-negotiation: No
 Speed: 100Mb/s
 Duplex: Half
 Port: MII
 PHYAD: 0
 Transceiver: internal
 Auto-negotiation: off
 Supports Wake-on: pumbg
 Wake-on: g
 Current message level: 0x00000033 (51)
          drv probe ifdown ifup
 Link detected: yes

-i 는 드라이버에 대한 정보를 보여주는 것이다. e1000 드라이버를 사용하고 있고, eeprom 접근이 가능한지 여부등이 나온다.

# ethtool -i eth0
driver: e1000
version: 7.3.21-k8-NAPI
firmware-version: N/A
bus-info: 0000:00:03.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes

-S 는 인터페이스 통계 정보를 보여준다. rx,tx 의 패킷 전송 개수, 바이트 정보, 브로드캐스팅 정보들이다. 대문자 S 를 사용했다는 점을 주의하자. 소문자 s 는 설정 할때 사용되는 옵션이다.

# ethtool -S eth0
NIC statistics:
     rx_packets: 10
     tx_packets: 29
     rx_bytes: 2145
     tx_bytes: 4100
     rx_broadcast: 0
     tx_broadcast: 3
     rx_multicast: 0
     tx_multicast: 18
     rx_errors: 0
     tx_errors: 0
     tx_dropped: 0
-a 는 Pause 파라미터에 대한 정보를 보여준다. Auto Negotiation 정보를 좀더 상세히 보여준다고 보면 된다.
# ethtool -a eth0
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: off
-p 는 어뎁터에서 어떤 포트가 내가 찾고자 하는 것인지 인지할 수 있도록 알려준다. 예를 들어, 어뎁터가 4개의 포트를 가지고 있다고 하자. 여기서 eth3 번이 어떤 포트인지 알고 싶을때 LED 를 깜빡 거리게 하여 알려줄 수 있는 것이다.
# ethtool -p eth3
-k  옵션은 네트워크 디바이스의 Offload 정보를 보여준다. 이 Offload 는 이더넷 카드에서 TOE 기능을 지원하게 되면 사용될 수 있는 기능으로, 여기서는 이렇게 설정 정보를 보여주는 기능이 있다는 정도에서만 설명하고 다음번 포스팅 때 Offload engine 에 대해서 다시 설명하도록 하겠다.
# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: on
large-receive-offload: off
rx-vlan-offload: on
tx-vlan-offload: on
ntuple-filters: off
receive-hashing: off

ethtool 외에 lshw 를 이용해 network 관련한 정보를 확인할 수도 있다.
# lshw -C network
  *-network               
       description: Ethernet interface
       product: 82540EM Gigabit Ethernet Controller
       vendor: Intel Corporation
       physical id: 3
       bus info: pci@0000:00:03.0
       logical name: eth0
       version: 02
       serial: 08:00[deleted]:d0
       size: 1Gbit/s
       capacity: 1Gbit/s
       width: 32 bits
       clock: 66MHz
       capabilities: pm pcix bus_master cap_list ethernet physical tp 10bt 10bt-fd 100bt 100bt-fd 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=e1000 driverversion=7.3.21-k8-NAPI duplex=full firmware=N/A ip=10.0.2.15 latency=64 link=yes mingnt=255 multicast=yes port=twisted pair speed=1Gbit/s
       resources: irq:10 memory:f0000000-f001ffff ioport:d010(size=8) 
여기서는 일반적인 방법을 설명한 것이므로, 여러분들 환경에 맞는 방법으로 이더넷 카드의 정보를 확인해 보거나 또는 설정할 수 있다. ethtool 에 대한 더 자세한 정보는 MAN 페이지를 참고하길 바란다.