대역폭을 제한 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
말합니다 .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/초입니다.
대역폭을 특정 속도로 제한하려면 어떤 매개변수를 설정해야 합니까?
htb
이를 위해 대기열 규칙을 사용해야 합니까 ?tbf
편집하다:
이러한 리소스를 기반으로 몇 가지 테스트를 수행했습니다.
- https://help.ubuntu.com/community/UbuntuBonding
- https://help.ubuntu.com/community/LinkAggregation
- /usr/share/doc/ifenslave-2.6/README.Debian.gzhttp://lartc.org/
다음 설정을 시도했습니다.
실제 머신에서
/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
다음은 구조 아래에서 리프를 사용하는 예 입니다 .HTB
tc qdisc add dev $dev parent $parent handle $handle pfifo limit 1000