tc qdisc 및 iperf 이해


15

로 대역폭을 제한 tc하고로 결과를 확인 하려고합니다 iperf. 나는 이렇게 시작했다 :

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35213 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   830 MBytes   696 Mbits/sec

두 인스턴스는 이더넷을 통해 직접 연결됩니다.

그런 다음 htb qdisc대역폭을 1mbit / sec로 제한하기 위해 하나의 기본 클래스로 설정했습니다 .

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit

그러나 나는 내가 기대하는 것을 얻지 못한다.

# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 35217 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-12.8 sec   768 KBytes   491 Kbits/sec

속도를 두 배로 늘리면 측정 된 대역폭이 변경되지 않습니다. 내가 무엇을 놓치고 있습니까? 측정 된 대역폭이 rate파라미터 의 1mbit에 해당하지 않는 이유는 무엇 입니까? 대역폭을 정확한 속도로 제한하기 위해 어떤 매개 변수를 설정해야합니까?

그러나이 man페이지에는 이 작업을 위해 선택 tbf해야한다고되어 있습니다 qdisc.

토큰 버킷 필터는 트래픽을 정확하게 구성된 속도로 느리게하는 데 적합합니다. 큰 대역폭으로 잘 확장됩니다.

tbf매개 변수가 필요합니다 rate, burst그리고 ( limit| latency). 따라서 가용 대역폭에 어떻게 burst( limit| latency) 영향을 미치는지 이해하지 않고 다음을 시도했습니다 .

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k

이것은 113Kbits / sec의 측정 된 대역폭을 얻었습니다. 이러한 매개 변수를 mtu가지고 놀아도 값을 추가하는 것이 크게 바뀌는 것을 알 때까지 크게 바뀌지 않았습니다 .

# tc qdisc add dev bond0 root tbf rate 1mbit limit 10k burst 10k mtu 5000

측정 된 대역폭은 1.00Mbits / sec입니다.

대역폭을 정확한 속도로 제한하기 위해 어떤 매개 변수를 설정해야합니까?

이를 위해 큐잉 htb또는 tbf큐잉 징계를 사용해야 합니까?

편집 :

이러한 리소스를 바탕으로 몇 가지 테스트를 수행했습니다.

다음 설정을 시도했습니다.

실제 머신에서

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto br0
iface br0 inet dhcp
bridge_ports eth0

로 측정 iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.4 port 51804 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

iperf서버가 다른 대역폭을 계산 한 반면 :

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.4 port 51804
[  4]  0.0-13.7 sec  1.62 MBytes   993 Kbits/sec

본딩이없는 가상 머신

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp

로 측정 iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.7 port 34347 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.3 sec  1.62 MBytes  1.21 Mbits/sec

iperf서버가 다른 대역폭을 계산 한 반면 :

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.7 port 34347
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

본딩이있는 가상 시스템 (tc가 eth0에 구성됨)

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

로 측정 iperf:

# tc qdisc add dev eth0 root handle 1: htb default 12
# tc class add dev eth0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49054 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-11.9 sec  1.62 MBytes  1.14 Mbits/sec

iperf서버가 다른 대역폭을 계산 한 반면 :

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49054
[  4]  0.0-14.0 sec  1.62 MBytes   972 Kbits/sec

본딩이있는 가상 시스템에서 (tc는 bond0에 구성됨)

/etc/network/interfaces:

auto lo
iface lo inet loopback

auto eth0
allow-bond0 eth0
iface eth0 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto eth1
allow-bond0 eth1
iface eth1 inet manual
    bond-master bond0
    bond-primary eth0 eth1

auto bond0
iface bond0 inet dhcp
    bond-slaves none
    bond-mode 1
#    bond-arp-interval 250
#    bond-arp-ip-target 192.168.2.1
#    bond-arp-validate 3

로 측정 iperf:

# tc qdisc add dev bond0 root handle 1: htb default 12
# tc class add dev bond0 parent 1: classid 1:12 htb rate 1mbit
# iperf -c 192.168.2.1
------------------------------------------------------------
Client connecting to 192.168.2.1, TCP port 5001
TCP window size: 23.5 KByte (default)
------------------------------------------------------------
[  3] local 192.168.2.9 port 49055 connected with 192.168.2.1 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-13.3 sec   768 KBytes   475 Kbits/sec

iperf서버가 다른 대역폭을 계산 한 반면 :

[  4] local 192.168.2.1 port 5001 connected with 192.168.2.9 port 49055
[  4]  0.0-14.1 sec   768 KBytes   446 Kbits/sec

eth1본드에서 (수동 인터페이스)를 제거해도 결과가 변경되지 않습니다 .

결론

본드 인터페이스의 트래픽 제어 가 작동하지 않거나 최소한 예상대로 작동하지 않습니다. 더 조사해야 할 것입니다.

해결 방법으로 큐잉 규칙 을 본드에 속한 인터페이스에 직접 추가 할 수 있습니다 .


이상하게도, 이것은이 남자를 위해 일한 것 같습니다 : blog.tinola.com/?e=22
Matías E. Fernández

1
htb를 사용 tc filter하면 패킷을 클래스에 넣는 데 사용해야한다고 생각 합니다. htb 매개 변수 중 일부를 변경해야 할 수도 있습니다 (tbf와 같이 조정). 나는 tcngtc의 프론트 엔드 인을 살펴볼 것을 제안한다 . (이것은 빠른 포인터입니다 ...)
derobert

귀하의 게시물에 필터가 없습니다. 속도를 제한하기 위해 트래픽을 맞추기 위해 어떤 명령을 사용하고 있습니까?

답변:


2

tc가 어떻게 작동하는지 확실하지 않은 경우에도 tc를 모니터링하고 패킷 흐름을 확인할 수 있습니까? 내 스크립트를 사용하여 tc를 모니터링 할 수 있으며 해제 된 권한으로 터미널에서 실행해야합니다. wlan0을 다른 인터페이스로 변경할 수 있으며 grep 및 awk도 필요합니다.

      #!/bin/sh
      INTERVAL=15
      while sleep $INTERVAL
      do
             /usr/sbin/tc -s -d class show dev wlan0

             uptime
             more /proc/meminfo | grep MemFree | grep -v grep
             echo cache-name num-active-objs total-objs obj-size
             SKBUFF=`more /proc/slabinfo | grep skbuff | grep -v grep | awk 
             '{print $2} {print $3} {print $4}'`

             echo skbuff_head_cache: $SKBUFF
      done

0

burst/ limit값을 늘리십시오 . 토큰 버킷 알고리즘은 잘 확장되지만 제한된 정확성 / 속도 비를 갖는다.

토큰 크기를 늘려 작은 버킷 속도를 사용하여 정확도를 달성합니다. 큰 토큰은 보충 비율이 감소 함을 의미합니다 (초당 토큰 = 초당 바이트 / 토큰 당 바이트).

rate매개 변수는 제공 평균 초과 할되지 비율 burst또는 limit매개 변수는 평균 창의 크기를 제공합니다. 라인 속도로 패킷을 전송하는 것이 패킷이 전송되는 시간 동안 설정된 속도를 초과하므로, 평균화 윈도우는 단일 패킷을 전송하는 것이 전체 윈도우를 한계를 넘어 가지 않도록 충분히 커야합니다. 더 많은 패킷이 창에 맞으면 알고리즘이 대상을 정확하게 칠 가능성이 높아집니다.


0

본딩 인터페이스 (이 경우 bond0)에 큐 규칙을 추가하기 전에이를 실행하십시오.

ipconfig bond0 txqueuelen 1000

본딩 인터페이스와 같은 소프트웨어 가상 장치에는 기본 대기열이 없기 때문에 작동하지 않습니다.


0

bond장치에 대기열이 정의되어 있지 않기 때문에 qdisc크기를 설정 하면 문제가 명시 적으로 해결됩니다.

다음은 리프 qdiscHTB구조에서 사용되는 예입니다 . tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.