
TC 큐 규율 DRR(Dificite Round Robin)이 있습니다.
HTB와 동일한 기능을 가지고 있지만 토큰으로 채워진 버킷을 사용하는 대신 모든 대기열에 Dificit Counter를 할당합니다. 패킷 전송 시 DC는 패킷 크기만큼 감소합니다. DC가 패킷 크기보다 작으면 대기열의 퀀텀만큼 DC가 증가하고 다음 대기열이 처리됩니다. 따라서 채널 폭(HTB에 필요한)을 모르더라도 나가는 트래픽을 일정 비율로 나눌 수 있습니다. 보다http://www.unix.com/man-page/linux/8/tc-drr/
설정: 호스트 2개, 172.16.1.1 및 172.16.1.2.
첫 번째 호스트에서는 트래픽을 수신하고 있습니다.
nc -l 8111
nc -l 8112
두 번째 호스트에서는 속도를 확인합니다.
pv /dev/zero | nc 172.16.1.1 8111
pv /dev/zero | nc 172.16.1.1 8112
이제 속도는 동일합니다(pv는 파이프라인을 통한 데이터 전송 속도를 측정할 수 있는 유틸리티입니다). 두 번째 호스트에 DRR을 추가합니다(상단의 HTB는 실제 채널 속도 제한을 에뮬레이션하는 데 사용됩니다).
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit
tc qdisc add dev eth0 parent 1:1 handle 2: drr
tc class add dev eth0 parent 2: classid 2:1 drr quantum 600
tc class add dev eth0 parent 2: classid 2:2 drr quantum 1400
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 8111 0xffff classid 2:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 8112 0xffff classid 2:2
속도는 동일하게 유지됩니다 :( 내가 뭘 잘못하고 있는 걸까요?
답변1
답변: DRR은 패킷 자체를 삭제하지 않습니다. 원하는 동작을 얻으려면 pfifo limit 50
하위 qdisc가 패킷을 무기한 대기열에 넣는 대신 패킷을 삭제하도록 하는 것과 같이 DRR 하위 클래스에 하위 qdisc를 추가하십시오 . 해결책은 여기에서 찾았습니다.linux.org.ru 스레드
참조:남자 tc-drr
참고 이 구현은 오버런 시 가장 긴 대기열의 패킷을 삭제하지 않습니다. 제한은 개별 하위 qdisc에 의해 처리되기 때문입니다.
답변2
drr은스케줄러, 여전히 htb를 사용하는 클래스에 다른 대역폭을 할당해야 합니다. 퀀텀을 600과 1400으로 지정하면 1:2 비율에 가깝습니다. 실제로는 그렇지 않습니다. 혼잡이 발생한 경우에만 구성에서 해당 비율에 가까워질 수 있습니다. 예를 들어 여러 개의 UDP 스트림을 생성한 다음 문제의 두 개를 측정하지만 여전히 예상한 결과는 아닙니다.