在Linux中限制网络带宽的使用

公司用的是实体服务器,租用机房带宽,买了30M的带宽,然而经常有带宽超额的问题,每个月都要额外交几千块,因此打算限制带宽。

在交换机上限制带宽是一种方法,但是这个挺麻烦的。另外,也可以通过软件限制带宽,在对外提供服务的服务器上限制带宽。

在Linux中限制一个网络接口的速率

这里介绍的控制带宽资源的方式是在每一个接口上限制带宽。wondershaper 就是干这个的,github上的版本是基于原开发者代码的基础上做的二次开发,添加了些功能。

wondershaper 实际上是一个 shell 脚本,它使用 tc 来定义流量调整命令,使用 QoS 来处理特定的网络接口。外发流量通过放在不同优先级的队列中,达到限制传出流量速率的目的;而传入流量通过丢包的方式来达到速率限制的目的。

其实, wondershaper 的既定目标不仅仅是对一个接口增加其带宽上限;当批量下载或上传正在进行时,wondershaper 还试图去保持互动性会话如 SSH 的低延迟。同样的,它还会控制批量上传(例如 Dropbox 的同步)不会使得下载“窒息”,反之亦然。即 上传和下载 互不影响。

安装 wondershaper

在 Fdora 或 CentOS/RHEL (带有 EPEL 软件仓库) 中安装 wondershaper(版本到 1.2 ):

1
# yum install wondershaper

经二次开发的最新版本( 最新为 1.4 ),直接下载github上的代码就可以了:

1
2
# git clone https://github.com/magnific0/wondershaper.git
# cd wondershaper

wondershaper 的使用

使用帮助:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# ./wondershaper -h
USAGE: ./wondershaper [-hcs] [-a <adapter>] [-d <rate>] [-u <rate>]
Limit the bandwidth of an adapter
OPTIONS:
-h Show this message
-a <adapter> Set the adpter
-d <rate> Set maximum download rate (in Kbps) and/or
-u <rate> Set maximum upload rate (in Kbps)
-p Use presets in /etc/conf.d/wondershaper.conf
-c Clear the limits from adapter
-s Show the current status of adapter
-v Show the current version
MODES:
wondershaper -a <adapter> -d <rate> -u <rate>
wondershaper -c -a <adapter>
wondershaper -s -a <adapter>
EXAMPLES:
wondershaper -a eth0 -d 1024 -u 512
wondershaper -a eth0 -u 512
wondershaper -c -a eth0

参数说明:

  • -a :指定要限制的网卡名称或者接口名称
  • -d :最大下载速率,单位:Kbps 。Kbps 即 Kb/s,p 是 peer 的意思。1KB/s=8Kb/s。1MB/s=1024KB/s。
  • -u :最大上传速率,单位:Kbps 。
  • -p :使用 /etc/conf.d/wondershaper.conf 的配置
  • -c :清空所有规则,不再做任何限制
  • -s :显示接口的当前状态

使用 ip addr show 查看要限制带宽的网卡名称,老的机器可能没有这个命令,改用 ifconfig 查看。

例子:
将 eth0 的最大下载/上传带宽分别设定为 3072 kbps 和 2048 kbps

1
# ./wondershaper -a eth0 -d 3072 -u 2048

清空规则,不再限制带宽

1
# ./wondershaper -a eth0 -c

这里的规则,重启服务器后就会失效,可以把命令写进 /etc/rc.local ,开机自启动。

测试网速

利用 speedtest-cli 来测试网速。

安装 speedtest-cli

speedtest-cli 是一个用 Python 编写的轻量级的命令行工具,用于测试带宽。Python2.4+ 的环境下均可运行。它是基于 speedtest.net 的基础架构来测量网络的上/下行速率。

pip/easy_install 方式安装:

1
2
3
4
# pip install speedtest-cli
# easy_install speedtest-cli

Github 方式安装:

1
2
3
4
5
# pip install git+https://github.com/sivel/speedtest-cli.git
# git clone https://github.com/sivel/speedtest-cli.git
# python speedtest-cli/setup.py install

直接下载脚本:

1
2
3
4
5
6
# wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
# chmod +x speedtest-cli
# curl -Lo speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
# chmod +x speedtest-cli

使用 speedtest-cli 测试网速

使用speedtest-cli命令也很简单,它不需要任何参数即可工作。

1
2
3
4
5
6
7
8
9
10
# speedtest-cli
Retrieving speedtest.net configuration...
Testing from China Telecom Guangdong (183.xxx.xxx.215)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by ShenZhen Telecom (Shenzhen) [0.00 km]: 2.856 ms
Testing download speed................................................................................
Download: 28.35 Mbit/s
Testing upload speed................................................................................................
Upload: 11.97 Mbit/s

结果解释:

  • 183.xxx.xxx.215 :本服务器IP
  • Testing from China Telecom Guangdong :ISP,这里是广东电信
  • Hosted by ShenZhen Telecom (Shenzhen) :服务器所在地址
  • [0.00 km] :本服务器和speedtest测试服务器地理位置之间距离

输入这个命令后,它会自动发现离你最近的 speedtest.net 服务器(地理距离),然后打印出测试的网络上/下行速率。

可以对比 wondershaper 配置前后的速率,验证限速是否生效。

speedtest-cli 常用命令详解:

  • –list :根据距离显示 speedtest.net 的测试服务器列表
  • –server=SERVER :指定测试服务器列表中id的服务器来测试
  • –share :分享测试结果,会在speedtest.net 网站上生成网速测试结果的图片
  • –bytes :上传下载的带宽显示,用 bytes 代替 bits ,即 Mbyte/s 代替 Mbit/s 。换算关系: 1Mbyte/s = 8Mbit/s