Centos기술노트
Traffic Control 기반의 트래픽 제어
잘나가는전산쟁이
2022. 8. 15. 00:04
728x90
반응형
Linux Traffic Control 개요
TC 소개
- 이 문서에서 이야기하는 TC는 Test Case가 아니라 Traffic Control의 약자다.
- Linux 커널은 기본적으로 성능을 우선하므로, 별도 설정이 없으면 대역폭 제한을 적용하지 않는다.
- 네트워크 장비나 스위치에서 대역폭 제한을 하더라도, 세밀한 정책을 서버 단에서 직접 제어하기는 어렵다.
- tc는 커널의 traffic control subsystem을 이용해 인터페이스별로 대역폭, 지연, 우선순위, 패킷 분배를 제어한다.
- tc는 iproute2 패키지에 포함되어 있으며, netstat, ifconfig, arp는 iproute2가 아니라 각각 net-tools 또는 별도 패키지 계열에 속한다.
Linux Traffic 처리 방식

- PREROUTING은 패킷이 시스템에 들어온 직후, 라우팅 결정 전에 처리된다.
- POSTROUTING은 라우팅이 끝난 뒤, 인터페이스로 나가기 직전에 처리된다.
- TC는 주로 네트워크 인터페이스의 egress/ingress 지점에서 shaping, policing, classifying에 사용된다.
Traffic Shaping 방식
- Shaping
- Traffic Shaping은 트래픽의 흐름을 의도적으로 지연시켜 목표 속도에 맞추는 방식이다.
- 일반적으로 egress shaping은 구현이 쉽고, ingress 제한은 보통 ifb 같은 가상 인터페이스를 함께 사용한다.
- TBF
- TBF 통신방식

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

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

- qdisc는 인터페이스에 연결되는 큐다.
- class는 qdisc 아래에서 대역폭을 계층적으로 나누는 단위다.
- filter는 특정 트래픽을 특정 class로 분류하는 역할을 한다.
- 즉, qdisc → class → filter 순서로 정책이 구성된다.
TBF 구성 예시
- eth0 인터페이스에 최대 10Mbps, 지연 70ms 기준으로 TBF를 적용한다.
-
$> tc qdisc add dev eth0 root tbf rate 10mbit latency 70ms burst 1540 - 적용 상태를 확인한다.
-
$> tc qdisc show dev eth0 - 대역폭을 20Mbps로 변경한다.
-
$> tc qdisc change dev eth0 root tbf rate 20mbit latency 70ms burst 1540 - 적용 상태를 다시 확인한다.
-
$> tc qdisc show dev eth0 - 설정을 삭제한다.
-
$> tc qdisc del dev eth0 root
HTB 구성 예시
- 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
- 위 예시에서 2049는 NFS, 22는 SSH에 대한 정책이다.
- rate는 기본 보장 대역폭이다.
- ceil은 class가 사용할 수 있는 최대 대역폭이다.
- prio는 필터 우선순위이며, 숫자가 낮을수록 우선 적용된다.
- 적용 확인
$> tc qdisc show dev eth0 $> tc class show dev eth0 $> tc filter show dev eth0
- tc filter show에서 포트 번호는 16진수 형태로 보일 수 있다.
- 정책을 변경하려면 tc class change를 사용한다.
$> tc class change dev eth0 parent 1:1 classid 1:11 htb rate 200mbit ceil 200mbit
NMS 연동 확인
- Traffic Shaping 적용 전에는 최대 610Mbps 수준까지 트래픽이 발생할 수 있다.

- Traffic Shaping을 100Mbps로 적용하면 실제 관측 속도는 그보다 낮게 나올 수 있다.

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