CS/network

Linux TC(Traffic Control)

아야는 못말려 2024. 10. 31. 12:29

현대 시스템에서는 여러 애플리케이션이 동시에 네트워크 자원을 사용하면서 서로 경쟁하게 됩니다. 특히 컨테이너 기반 환경에서는 네트워크 사용량이 증가함에 따라 자원 경쟁으로 인해 성능 저하나 지연(latency)이 발생할 수 있습니다. 이런 문제를 해결하기 위해 Linux 커널은 TC(Traffic Control)라는 네트워크 트래픽 제어 시스템을 제공합니다.

 

 

 

TC의 역할

TC는 네트워크 트래픽을 효과적으로 관리하고 최적화하여 처리량(Throughput)지연(Latency) 같은 네트워크 성능 지표를 개선하는 데 사용됩니다. tc를 사용하여 특정 유형의 트래픽에 우선순위를 부여하거나, 각 애플리케이션 및 컨테이너가 사용 가능한 대역폭을 제한할 수 있습니다.

 

TC의 동작 과정

네트워크 패킷이 장치를 통과할 때 TC는 다음과 같은 단계별 절차를 거쳐 트래픽 정책을 적용합니다.

  1. 분류(Classification)
    패킷이 어떤 유형의 트래픽인지 판별하고, 이에 따라 적용할 정책을 결정합니다. 예를 들어, HTTP 트래픽과 BitTorrent 트래픽을 분류해 서로 다른 대역폭을 할당할 수 있습니다.
  2. 스케줄링(Scheduling)
    네트워크 장치의 대기열(queue)에 있는 패킷들의 전송 순서를 결정합니다. 가장 기본적인 방식은 FIFO(First In First Out)로, 먼저 도착한 패킷부터 전송합니다. 하지만 상황에 따라 우선순위를 다르게 설정할 수도 있습니다.
  3. 쉐이핑(Shaping)
    패킷 전송 속도를 조정하여 네트워크에 갑작스럽게 트래픽이 몰리는 것을 방지합니다. 일정 속도로 패킷을 전송해 네트워크 혼잡을 완화합니다.
  4. 폴리싱(Policing)
    네트워크로 들어오는 트래픽의 대역폭을 제한합니다. 설정된 규칙을 초과하는 패킷은 삭제하거나 거부할 수 있습니다.

 

TC의 주요 구성 요소

TC는 크게 QDisc(Queueing Discipline), 클래스(Class), 필터(Filter)라는 세 가지 구성 요소로 나뉘며, 각 요소가 유기적으로 연동하여 트래픽을 관리합니다.

Qdisc와 class 그리고 filter가 적용된 인터페이스의 모습

QDisc(큐잉 디스플린)

QDisc는 패킷을 대기열에 넣고 꺼내는 규칙을 정의하는 기본 단위입니다.

  • 클래스리스(Classless) QDisc
    모든 트래픽을 동일하게 처리하며, 세부적인 트래픽 분류나 정책 적용이 불가능합니다.
    • 예: pfifo_fast
      기본적으로 사용하는 QDisc로, 단순한 선입선출(FIFO) 방식입니다.
  • 클래스풀(Classful) QDisc
    트래픽을 여러 클래스로 나누어 각각의 클래스에 다른 정책을 적용할 수 있습니다.
    • 예: HTB(Hierarchical Token Bucket)
      대역폭을 계층적으로 관리할 수 있는 QDisc입니다. 예를 들어, HTTP 트래픽에 500Mbps, BitTorrent 트래픽에 200Mbps를 할당할 수 있습니다.

주요 QDisc 유형

  • pfifo_fast (Classless): 간단한 FIFO 방식의 기본 QDisc입니다.
  • htb (Hierarchical Token Bucket, Classful): 트래픽을 계층적으로 관리할 수 있어 서로 다른 트래픽 유형에 대역폭 정책을 설정할 수 있습니다.
  • fq_codel (Classless): 네트워크 지연(latency)을 줄이는 데 특화된 QDisc입니다. 혼잡 상황에서 지연을 최소화하는 알고리즘을 사용합니다.
  • clsact (Classless): eBPF 프로그램을 사용해 고도로 커스터마이즈된 트래픽 제어를 수행할 수 있습니다.

 

클래스(Class)

클래스풀 QDisc는 여러 개의 클래스를 가질 수 있습니다.

각 클래스는 하위 QDisc를 포함할 수 있으며, 이를 통해 트래픽을 계층적으로 관리합니다.

예를 들어, 한 클래스에서는 HTTP 트래픽을 처리하고, 다른 클래스에서는 비디오 스트리밍 트래픽을 처리하는 방식으로 트래픽을 분할할 수 있습니다.

 

필터(Filter)와 액션(Action)

필터는 패킷을 특정 조건에 따라 분류하는 역할을 합니다. 일반적으로 classful QDisc에 연결되어 특정 조건에 따라 패킷을 분류하며, 이를 통해 패킷이 어느 클래스에 속할지를 결정합니다.

필터가 패킷을 분류하면 지정된 액션(Action)을 수행할 수 있습니다. 예를 들어, 특정 패킷을 삭제하거나 필터가 패킷을 분류한 후, 해당 패킷은 연결된 클래스나 하위 QDisc로 전달 할 수 있습니다. 

 

action 

필터가 action을 직접 반환하는 경우도 있습니다. 이를 direct action 모드라고 부르며, 이 경우 필터의 반환 값은 클래스 ID가 아닌 동작 코드로 해석됩니다.

 

지원되는 action 종류

  • TC_ACT_OK: 패킷을 통과시킴
  • TC_ACT_SHOT: 패킷을 드롭(삭제)
  • TC_ACT_RECLASSIFY: 패킷을 재분류하여 다시 필터 규칙을 적용
  • TC_ACT_PIPE: 패킷을 체인의 다음 요소로 전달

 

그림으로 흐름 이해해보기

 

  1. 네트워크 인터페이스로 트래픽 도착
    트래픽은 먼저 네트워크 인터페이스에 도착하며, 해당 인터페이스에 설정된 QDisc가 트래픽을 처리하게 됩니다.
  2. 필터(Filter/Classifier)로 트래픽 분류
    트래픽은 필터를 통해 특정 조건에 따라 분류됩니다.
    • 필터는 패킷의 속성(예: 프로토콜, 포트 번호 등)을 기준으로 트래픽을 다양한 클래스(Class)로 분산시킵니다.
    • 필터에 동작(Action)이 정의된 경우, 트래픽을 바로 삭제하거나 조작하는 작업이 실행될 수 있습니다. 이 경우 해당 트래픽은 QDisc로 전달되지 않고 즉시 처리됩니다.
  3. QDisc로 트래픽 전달
    필터의 조건이 충족되고 별도의 작업이 없는 경우, 트래픽은 해당 QDisc에 할당됩니다.
  4. QDisc에서 트래픽 처리
    트래픽은 QDisc에서 설정된 규칙에 따라 대기열(queue)에서 순차적으로 처리됩니다. 예를 들어, FIFO 방식, 우선순위 방식 또는 대역폭 제한 규칙 등이 적용될 수 있습니다.
  5. 네트워크로 전송
    최종적으로 QDisc에서 처리된 트래픽이 네트워크로 전송됩니다.

 

TC의 한계와 보완 방법

TC는 네트워크의 egress에서는 다양한 정책을 적용할 수 있지만,  ingress에서는 주로 폴리싱 기능만 지원합니다. 수신하는 과정에서는 shaping(속도 조정)이 거의 불가능하기 때문입니다. 네트워크로 들어오는 트래픽의 양을 제어하는 것은 송신자가 결정하기 때문에, 리눅스 호스트가 중간에서 속도를 직접 줄일 수 없습니다. 따라서 트래픽이 특정 조건(대역폭 초과 등)을 초과하면 Policing을 통해 패킷을 드롭하거나 마크하는 방식을 사용합니다. 하지만 송신할 때에는 호스트가 직접 전송하는 것이기 때문에 속도를 조절하거나 패킷을 대기열에 보관하며 전송 순서를 조정하는 것이 가능합니다.

 

IFB(Intermediate Functional Block) 장치

IFB는 송신(egress)과 수신(ingress) 경로가 반대로 설정된 가상 네트워크 장치로, 수신 트래픽에 대기열(qdisc)을 연결하여 쉐이핑할 수 있도록 합니다.

  1. 먼저 커널 모듈을 로드하여 IFB 장치를 생성합니다.
  2. 그런 다음 물리 NIC의 수신 트래픽을 새로 생성된 IFB 장치로 리다이렉트합니다. 이 과정에서 CONNMARK는 패킷에 저장된 연결 정보(마크)를 읽어들여, 패킷이 어떤 연결에 속하는지 식별해줍니다.
  3. 이 시점에서 IFB 장치에서 나가는 패킷은 최종적으로 애플리케이션에 도달하기 전에 쉐이핑될 수 있습니다.

TC 필터는 인터페이스에서 패킷을 "가로채서" 다른 인터페이스로 전송할 수 있는 기능이 있습니다. 따라서 수신 경로가 다음과 같이 변경됩니다

 

 

 

<참고자료>

https://ntk148v.github.io/posts/linux-network-performance-ultimate-guide/

 

kiennt26's home | Linux Network Performance Ultimate Guide

The following content is from my #til github. Source Linux Networking stack Source: It’s a getting started. Before perform any tuning, let make sure that we understand how computers running Linux receive packets.Linux queue: NOTE: The follow sections wil

ntk148v.github.io

https://bootlin.com/blog/tag/tc/

https://techblog.criteo.com/demystification-of-tc-de3dfe4067c2