Linux流量控制Traffic Control网络限速
一. 简要概述
流量控制(tc)是一个非常有用的Linux实用程序,它能配置内核数据包调度程序,tc可以模拟UDP或TCP应用程序的数据包延迟和丢失,或者限制特定服务的带宽、限制上网速度等等场景。网络带宽限速。
二. 工具安装
# Debain 和 Redhat 系列的系统安装 iproute 包即可
sudo apt-get install -y iproute
sudo yum install -y iproute
三. 控制网络延迟(双向)
这里的延迟控制是双向的,即当前主机到其他主机延迟,其他主机到当前主机延迟。
# 新增eth0延迟200ms
sudo tc qdisc add dev eth0 root netem delay 200ms
# 新增eth0延迟200ms,上下随机加减0到正负50ms
sudo tc qdisc add dev eth0 root netem delay 200ms 50ms
# 查看eth0上的延迟限制
tc qdisc show dev eth0
# 删除eth0的延迟限制
sudo tc qdisc del dev eth0 root
# 修改eth0的延迟为400ms
sudo tc qdisc change dev enp2s0 root netem delay 400ms
# 修改eth0的延迟为400ms,上下随机加减0到正负50ms
sudo tc qdisc change dev enp2s0 root netem delay 400ms 50ms
参数
- qdisc: modify the scheduler (aka queuing discipline)
- add: add a new rule
- dev eth0: rules will be applied on device eth0
- root: modify the outbound traffic scheduler (aka known as the egress qdisc)
- netem: use the network emulator to emulate a WAN property
- delay: the network property that is modified
- 200ms: introduce delay of 200 ms
四. 控制网络丢包(双向)
# 新增eth0丢包率为10%
sudo tc qdisc add dev eth0 root netem loss 10%
# 使用-c参数控制只发送100个包,然后就统计丢失率。
ping 10.10.10.20 -c 100
ping 10.10.10.30 -c 100
五. 控制包损坏率(双向)
# 10% 的包会发生错误
sudo tc qdisc add dev eth0 root netem corrupt 10%
六. 控制包重复率(双向)
# %10 的包会重复发送
sudo tc qdisc add dev eth0 root netem duplicate 10%
七. 网络带宽限制(出口)
使用场景:比如在服务器上下载数据包时,不想把服务器的带宽全部占满,此时可以选择使用tc在服务器上设置,设置出口带宽。
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
参数
- tbf: use the token buffer filter to manipulate traffic rates
- rate: sustained maximum rate
- burst: maximum allowed burst
- latency: packets with higher latency get dropped
测试
假设要限制当前主机的出口带宽(10.10.10.212)
# 在10.10.10.212上没有添加带宽限制前查看最大带宽为 258 Mbits/sec
sudo iperf -c 10.10.10.212 -p 5201
------------------------------------------------------------
Client connecting to 10.10.10.212, TCP port 5201
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.10.10.19 port 39206 connected with 10.10.10.212 port 5201
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.0 sec 307 MBytes 258 Mbits/sec
# 在10.10.10.212上添加带宽限制: 维持在1Mbit左右,
sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms
# 在10.10.10.212上添加带宽限制后查看最大带宽为 1.11 Mbits/sec
sudo iperf -c 10.10.10.212 -p 5201
------------------------------------------------------------
Client connecting to 10.10.10.212, TCP port 5201
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[ 3] local 10.10.10.19 port 39210 connected with 10.10.10.212 port 5201
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-10.4 sec 1.38 MBytes 1.11 Mbits/sec