콘텐츠로 이동






back

Linux Traffic Control 개요

TC 소개

  • 이 문서에서 이야기하는 TC는 Test Case가 아니라 Traffic Control의 약자다.
  • Linux 커널은 기본적으로 성능을 우선하므로, 별도 설정이 없으면 대역폭 제한을 적용하지 않는다.
  • 네트워크 장비나 스위치에서 대역폭 제한을 하더라도, 세밀한 정책을 서버 단에서 직접 제어하기는 어렵다.
  • tc는 커널의 traffic control subsystem을 이용해 인터페이스별로 대역폭, 지연, 우선순위, 패킷 분배를 제어한다.
  • tc는 iproute2 패키지에 포함되어 있으며, netstat, ifconfig, arp는 iproute2가 아니라 각각 net-tools 또는 별도 패키지 계열에 속한다.

Linux Traffic 처리 방식

다운로드.png

  • PREROUTING은 패킷이 시스템에 들어온 직후, 라우팅 결정 전에 처리된다.
  • POSTROUTING은 라우팅이 끝난 뒤, 인터페이스로 나가기 직전에 처리된다.
  • TC는 주로 네트워크 인터페이스의 egress/ingress 지점에서 shaping, policing, classifying에 사용된다.

Traffic Shaping 방식

  1. Shaping
  2. Traffic Shaping은 트래픽의 흐름을 의도적으로 지연시켜 목표 속도에 맞추는 방식이다.
  3. 일반적으로 egress shaping은 구현이 쉽고, ingress 제한은 보통 ifb 같은 가상 인터페이스를 함께 사용한다.

  4. TBF

  5. TBF 통신방식
    TBF Data Flow
  6. TBF(Token Bucket Filter)는 토큰 버킷 기반으로 트래픽을 제한하는 가장 단순한 shaping 방식이다.
  7. 지정한 속도와 지연(latency), 버스트(burst)를 기준으로 전송량을 제어한다.
  8. 일반적으로 egress 트래픽 shaping에 사용한다.

  9. HTB

  10. HTB 통신방식
    HTB Data Flow
  11. HTB(Hierarchy Token Bucket)는 TBF를 계층 구조로 확장한 방식이다.
  12. 여러 class를 만들 수 있어서 특정 IP, 포트, 서비스별로 서로 다른 대역폭 정책을 적용하기 좋다.
  13. 일반적으로 egress 트래픽 분류 및 제한에 사용한다.

  14. HTB Queue 구조
    HTB Queue

  15. qdisc는 인터페이스에 연결되는 큐다.

  16. class는 qdisc 아래에서 대역폭을 계층적으로 나누는 단위다.
  17. filter는 특정 트래픽을 특정 class로 분류하는 역할을 한다.
  18. 즉, qdisc → class → filter 순서로 정책이 구성된다.

TBF 구성 예시

  1. eth0 인터페이스에 최대 10Mbps, 지연 70ms 기준으로 TBF를 적용한다.

    $> tc qdisc add dev eth0 root tbf rate 10mbit latency 70ms burst 1540
    

  2. 적용 상태를 확인한다.

    $> tc qdisc show dev eth0
    

  3. 대역폭을 20Mbps로 변경한다.

    $> tc qdisc change dev eth0 root tbf rate 20mbit latency 70ms burst 1540
    

  4. 적용 상태를 다시 확인한다.

    $> tc qdisc show dev eth0
    

  5. 설정을 삭제한다.

    $> tc qdisc del dev eth0 root
    

HTB 구성 예시

  1. eth0 인터페이스에 기본 정책을 두고, 특정 포트별로 class를 나눠 제한한다.

    $> tc qdisc add dev eth0 root handle 1: htb default 10
    $> tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
    $> tc class add dev eth0 parent 1:1 classid 1:10 htb rate 50mbit ceil 50mbit prio 0
    $> tc class add dev eth0 parent 1:1 classid 1:11 htb rate 20mbit ceil 20mbit prio 0
    $> tc filter add dev eth0 protocol ip parent 1: prio 0 u32 match ip dport 2049 0xffff flowid 1:10
    $> tc filter add dev eth0 protocol ip parent 1: prio 0 u32 match ip dport 22 0xffff flowid 1:11
    

  2. 위 예시에서 2049는 NFS, 22는 SSH에 대한 정책이다.

  3. rate는 기본 보장 대역폭이다.
  4. ceil은 class가 사용할 수 있는 최대 대역폭이다.
  5. prio는 필터 우선순위이며, 숫자가 낮을수록 우선 적용된다.

  6. 적용 확인

    $> tc qdisc show dev eth0
    $> tc class show dev eth0
    $> tc filter show dev eth0
    

  7. tc filter show에서 포트 번호는 16진수 형태로 보일 수 있다.

  8. 정책을 변경하려면 tc class change를 사용한다.

    $> tc class change dev eth0 parent 1:1 classid 1:11 htb rate 200mbit ceil 200mbit
    

NMS 연동 확인

  1. Traffic Shaping 적용 전에는 최대 610Mbps 수준까지 트래픽이 발생할 수 있다.
    다운로드 (4).png

  2. Traffic Shaping을 100Mbps로 적용하면 실제 관측 속도는 그보다 낮게 나올 수 있다.
    다운로드 (5).png

알려진 문제

  • 실제 트래픽은 중간에 큐잉과 스케줄링 단계를 거치므로, 설정한 값과 실제 전송량이 정확히 일치하지 않을 수 있다.
  • TBF는 버킷 용량보다 큰 트래픽이 순간적으로 들어오면 패킷을 지연시키거나 드롭할 수 있다.
  • ingress 트래픽을 제한하려면 보통 ifb를 활용한 우회 구성이 필요하다.
  • tc는 정책이 재부팅 후 유지되지 않으므로, 부팅 시 스크립트나 systemd unit으로 다시 적용해야 한다.