결론적으로

결론적으로

대역폭을 제한 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/s로 제한하는 기본 클래스를 설정합니다 .

# 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

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

그러나 페이지에서는 이 작업을 위해 이것이 선택 되어야 한다고 man말합니다 .tbfqdisc

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

tbf매개변수 rateburst( 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/초입니다.

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

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

본딩이 포함된 VM(eth0에 구성된 tc)

/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

본딩이 포함된 VM(bond0에 구성된 tc)

/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바인딩에서 (수동 인터페이스)를 제거해도 결과는 변경되지 않습니다.

결론적으로

교통 통제결합된 인터페이스에서는 작동하지 않거나 적어도 예상대로 작동하지 않습니다. 좀 더 조사해 봐야겠습니다.

해결 방법으로 다음을 추가할 수 있습니다.대기열 규율본드에 속한 인터페이스에 직접 연결합니다.

답변1

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

답변2

burst/ 값을 늘려보세요 limit. 이것토큰 버킷알고리즘은 확장이 잘 되지만 정확도/속도 비율이 제한되어 있습니다.

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

rate매개변수는평균인수에 의해 제공된 평균화 창의 비율 burst이나 크기를 초과하지 마십시오. limit회선 속도로 패킷을 전송하면 패킷이 전송되는 설정된 속도를 초과하므로 평균화 창은 창에 더 많은 패킷이 맞는 경우 단일 패킷을 보내도 전체 창이 제한을 초과하지 않도록 충분히 커야 합니다. 알고리즘은 목표물을 정확하게 맞출 가능성이 더 높아집니다.

답변3

결합된 인터페이스(이 예에서는 bond0)에 대기열 규칙을 추가하기 전에 이 명령을 실행하십시오.

ipconfig bond0 txqueuelen 1000

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

답변4

bond장치에 정의된 대기열이 없기 때문에 qdisc크기를 설정하면 내 문제가 명시적으로 해결되었습니다.

qdisc다음은 구조 아래에서 리프를 사용하는 예 입니다 .HTBtc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000

관련 정보